3

In the absence of multithreading, the implementation of copy-on-write for shared_ptr (either from boost or tr1) using unique() is straightforward. Which changes need to be made when multithreading? The reference count is atomic so I assume I can create, copy-construct, read and destroy instances of shared_ptr without further concerns. How about updating them, in general, and particularly when implementing copy-on-write? Are locks needed? Or use boost::atomic_store (why is it not documented)? Or wait for a fully atomic version of shared_ptr (not an option)?

Edit:
sfossen, thank you for your helpful reply.
So I conclude that if I change a pointed-to object only after detaching it via COW, so that only the current thread owns it, no locking is needed and the COW implementation looks just like the single-threaded one when using shared_ptr with atomic ref-counts.

4

2 回答 2

6

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

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

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

如果您不能完全保证这些,请使用锁定或原子更新。

如果要锁定:

现在在后备箱中似乎确实有一个原子版本。

如果您无法更新 boost,您可以暂时导入所需的函数,或者将其包装在像读/写锁这样的锁中。

来自 shared_ptr.hpp

template<class T> shared_ptr<T> atomic_exchange( shared_ptr<T> * p, shared_ptr<T> 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的文章

于 2009-03-05T23:20:40.690 回答
0

在没有某种形式的同步的情况下复制 shared_ptr 是不安全的,除非它由执行复制的线程拥有。线程安全保证仅适用于由线程拥有的 shared_ptr,其中 shared_ptr 的内部引用计数可能由其他线程拥有的 shared_ptr 共享。

你想要的行为是我会调用原子线程安全的,它当前在 shared_ptr 中不存在,甚至在 C++0x 之后也可能不会。名称 shared_ptr 在这里可能有点令人困惑,因为您无法在没有同步的情况下在线程之间真正共享 shared_ptr。

于 2009-03-08T14:18:10.517 回答