void onStringMessage(const TcpConnectionPtr&,
const string& message,
Timestamp)
{
MutexLockGuard lock(mutex_);
for (ConnectionList::iterator it = connections_.begin();
it != connections_.end();
++it)
{
codec_.send(get_pointer(*it), message);
}
- 使用 shared_ptr 做 copy-on-write
- 使用TLS(线程局部存储)
shared_ptr 实现 copy-on-write
本文先分析如何借助 shared_ptr 实现 copy-on-write。
- shared_ptr 是引用计数智能指针,如果当前只有一个观察者(原始创建者持有),那么引用计数为 1,可以用 shared_ptr::unique() 来判断。
- 对于 write 端,如果发现引用计数为 1,这是可以安全地修改对象,不必担心有人在读它。
- 对于 read 端,在读之前把引用计数加 1,读完之后减 1,这样可以保证在读的期间其引用计数大于 1,可以阻止并发写。
- 比较难的是,对于 write 端,如果发现引用计数大于 1,该如何处理? 既然更新数据,肯定要加锁,如果这时候其他线程在读,那么不能在原来的数据上修改,得创建一个副本,在副本上修改,修改完了再替换。如果没有用户在读,那么可以直接修改。
2万+



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



