我想知道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;?
答案 0 :(得分:1)
我想我在boost docs.
中找到了答案//--- Example 3 ---
// thread A
p = p3; // reads p3, writes p
// thread B
p3.reset(); // writes p3; undefined, simultaneous read/write
我试图做的是同时读写,这是未定义/不安全。