[英]Can shared_ptr.get() be called by multiple threads while another thread locks and calls shared_ptr.swap()?
我想知道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 /->?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.