可以通过多个线程调用shared_ptr.get(),而另一个线程可以锁定并调用shared_ptr.swap()吗?

时间:2014-07-10 17:07:20

标签: c++ multithreading boost concurrency

我想知道shared_ptr是否安全。请原谅我的伪代码:

Thread 1:
do lock
ReadOnlyObj obj = make_shared<ReadOnlyObj>();
some_shared_ptr.swap(obj);
do unlock

Thread 2-N:
//no lock
some_shared_ptr->getterOnObj();

CPP参考说

  

所有成员函数(包括复制构造函数和复制赋值)都可以由shared_ptr的不同实例上的多个线程调用,而无需其他同步,即使这些实例是副本并共享同一对象的所有权。如果多个执行线程在没有同步的情况下访问相同的shared_ptr,并且任何访问都使用shared_ptr的非const成员函数,那么将发生数据争用,原子函数的shared_ptr重载可用于防止数据竞赛。

但是,根据GNU docs

  

Boost shared_ptr(在GCC中使用)具有一个聪明的无锁算法来避免竞争条件,但这依赖于支持原子比较和交换指令的处理器。对于其他平台,使用互斥锁进行回退。 Boost(从版本1.35开始)包括几个不同的实现,预处理器根据编译器,标准库,平台等选择一个。对于libstdc ++中的shared_ptr版本,编译器和库是固定的,这使事情变得更简单:我们有一个原子CAS或我们没有,请参阅下面的锁定政策了解详情。

据我所知,intel x86_64支持CAS。

所以,对我的问题:

shared_ptr :: swap是非const的。 get和 - &gt;()是const。鉴于上面列出的使用场景,我是否必须锁定get / - &gt;?

1 个答案:

答案 0 :(得分:1)

我想我在boost docs.

中找到了答案
//--- Example 3 ---

// thread A
p = p3; // reads p3, writes p

// thread B
p3.reset(); // writes p3; undefined, simultaneous read/write

我试图做的是同时读写,这是未定义/不安全。