当前位置:  开发笔记 > 编程语言 > 正文

多线程时使用shared_ptr进行写时复制

如何解决《多线程时使用shared_ptr进行写时复制》经验,为你挑选了1个好方法。

在没有多线程的情况下,shared_ptr(使用boost或tr1)使用的写入时复制的实现 unique()非常简单.多线程需要进行哪些更改?引用计数是原子的,所以我假设我可以创建,复制构造,读取和销毁实例而shared_ptr无需进一步关注.一般来说,如何更新它们,特别是在实现写时复制时?需要锁吗?或使用boost::atomic_store (为什么没有记录)?或者等待完全原子版 shared_ptr(不是选项)?

编辑:
sfossen,谢谢你的回复.
所以我得出结论,如果我只是在通过COW分离之后更改了一个指向对象,那么只有当前线程拥有它,不需要锁定,并且当使用带有原子引用的shared_ptr时,COW实现看起来就像单线程一样-COUNTS.



1> sfossen..:

使用COW,您只需要在复制可能正在更改的对象时锁定.

因此,如果对象的COW是在线程之前设置的对象并且永远不会更改,则不需要锁定.

但是,如果要复制副本,则需要在初始写入期间至少锁定,或者确保副本具有所有更改,然后才能再次复制.

如果你不能完全保证那些,那么使用锁定或原子更新.

如果你想要锁定:

现在看来在主干中似乎有一个原子版本.

如果无法更新boost,则可以立即导入所需的函数,也可以将其包装在锁定器中,如读取器/写入器锁定.

来自shared_ptr.hpp

template shared_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的文章

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有