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的非const成员函数,则会发生数据争用,可以使用原子函数的shared_ptr重载来防止数据争用。
但是,根据GNU文档:
Boost shared_ptr(在GCC中使用)具有一个聪明的无锁算法来避免竞争条件,但这依赖于处理器支持原子比较和交换指令。对于其他平台,有使用互斥锁的回退。Boost(从1.35版本开始)包括几种不同的实现,预处理器根据编译器、标准库、平台等选择一种实现。对于libstdc++中的shared_ptr版本,编译器和库是固定的,这使得事情变得简单得多:我们有一个原子CAS,或者没有,详细信息请参见下面的锁策略。
据我所知,intel x86_64支持CAS。
那么,对于我的问题:
shared_ptr::swap是非const。Get和->()是const。考虑到上面列出的使用场景,我还必须锁定get/->吗?
我想我自己在boost文档中找到了答案。
//--- Example 3 ---
// thread A
p = p3; // reads p3, writes p
// thread B
p3.reset(); // writes p3; undefined, simultaneous read/write
我要做的是同时读写,这是未定义的/不安全的
相关文章:
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在另一个线程中调用luaL_error会引发qWarning
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 如何从线程中的不同模块调用函数?
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- 如何声明由多个线程调用的 C++ DLL 的内部类,而无需导出类
- 是否可以创建一个从不同类调用函数的线程?
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- 非静态成员失败的线程调用函数
- 线程调用的函数对对象删除是否安全?
- 将类成员函数作为线程调用到另一个类成员函数时发出警告消息
- 通过 Qt 中的线程调用 Rust 库
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 由并发无序映射查找线程调用的函数是否安全?
- 每个线程 C++ 保护以防止重入函数调用
- localtime() 函数正在调用 ___lll_lock_wait_private(),这会使线程陷入死锁
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 线程 std::调用未知类型,无法专门化函数错误
- 工作线程一直在等待,condition_variable甚至调用了notify_all