Chrome中大量用到了Observer模式,比较关键的类是ObserverList。
这个类的comment,提到了一个很关键的问题,就是在loop每个observer时,可能有observer尝试着被调用RemoveObserver,从列表中去除,而ObserverList内部是借用std::vector存储所有的observer,这样就会导致一个问题,就是std::vector::erase函数可能会invalidate所有的iterator,后续的notification就会失败。
// A container for a list of observers. Unlike a normal STL vector or list,
// this container can be modified during iteration without invalidating the
// iterator. So, it safely

Chrome的ObserverList类在实现Observer模式时,针对遍历过程中可能发生的RemoveObserver操作,通过使用notify_depth_变量和NULL标记策略,确保遍历的正确性和安全性。在初始化迭代器时notify_depth_加1,移除观察者时若遍历中则将其指针置为NULL,遍历结束后进行紧凑化处理,有效处理动态移除观察者的问题。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



