我想知道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的非常量成员函数,则将发生数据争用,原子函数的shared_ptr重载可用于防止数据争用。
但是,根据GNU文档:
Boost shared_ptr(在GCC中使用)具有一种巧妙的无锁算法来避免出现竞争情况,但这依赖于处理器支持原子的Compare-And-Swap指令。对于其他平台,存在使用互斥锁的后备功能。Boost(从1.35版开始)包括几种不同的实现,预处理器根据编译器,标准库,平台等选择一种。对于libstdc ++中shared_ptr的版本,编译器和库是固定的,这使事情变得简单得多:原子CAS或我们不知道,有关详细信息,请参见下面的“锁定策略”。
据我所知,英特尔x86_64支持CAS。
所以,对我的问题:
shared_ptr :: swap是非常量的。get和->()是常量。给定上面列出的使用场景,我是否也必须锁定get /->?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句