在没有多线程的情况下,shared_ptr
(使用boost或tr1)使用的写入时复制的实现
unique()
非常简单.多线程需要进行哪些更改?引用计数是原子的,所以我假设我可以创建,复制构造,读取和销毁实例而shared_ptr
无需进一步关注.一般来说,如何更新它们,特别是在实现写时复制时?需要锁吗?或使用boost::atomic_store
(为什么没有记录)?或者等待完全原子版
shared_ptr
(不是选项)?
编辑:
sfossen,谢谢你的回复.
所以我得出结论,如果我只是在通过COW分离之后更改了一个指向对象,那么只有当前线程拥有它,不需要锁定,并且当使用带有原子引用的shared_ptr时,COW实现看起来就像单线程一样-COUNTS.
使用COW,您只需要在复制可能正在更改的对象时锁定.
因此,如果对象的COW是在线程之前设置的对象并且永远不会更改,则不需要锁定.
但是,如果要复制副本,则需要在初始写入期间至少锁定,或者确保副本具有所有更改,然后才能再次复制.
如果你不能完全保证那些,那么使用锁定或原子更新.
现在看来在主干中似乎有一个原子版本.
如果无法更新boost,则可以立即导入所需的函数,也可以将其包装在锁定器中,如读取器/写入器锁定.
来自shared_ptr.hpp
templateshared_ptr atomic_exchange( shared_ptr * p, shared_ptr r ) { boost::detail::spinlock & sp = boost::detail::spinlock_pool<2>::spinlock_for( p ); sp.lock(); p->swap( r ); sp.unlock(); return r; // return std::move( r ) }
关于RWLocks的文章