【发布时间】:2015-07-07 11:16:24
【问题描述】:
如果在迭代期间可能会删除对象,我如何安全地迭代容器?我基本上是在尝试实现观察者模式,有些事件会导致监听器从订阅容器中移除,从而导致迭代器出现问题。
我考虑过为每个听众提供一个标志,当它希望从订阅者列表中删除时,它可以设置该标志。因此,主体不会直接删除自己的侦听器,而是会在迭代期间检查标志,跳过标记的侦听器,并在发送完通知后清除所有标记的侦听器。
我考虑的另一个选择是为每次调用 listener.notify 启动一个线程,并让主题上的 remove_listener 方法成为互斥锁操作。
第一个选项似乎不好,因为使用标志来指示某些对象的状态往往会在整个程序中激增,并且很快每次处理对象时都需要检查 if (!object.TO_BE_DELETED) 类似于源自 null 的问题指针。
第二个选项带来了使用线程的所有麻烦,如果程序使用大量事件,我很确定这会很快产生性能问题。
那么有什么更好的办法解决这个问题呢?
【问题讨论】:
标签: c++ iteration containers observer-pattern