繁体   English   中英

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

[英]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 /->?

我想我自己在boost文档中找到了答案

//--- Example 3 ---

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

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

我想做的是同时读写,这是不确定的/不安全的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM