C++智能指针是否无锁定
Are C++ smart pointers lockfree?
以下操作对std::unique_ptr
和/或std::shared_ptr
是否无锁定?
- 取消引用,即
read(*myPtr)
或myPtr->getSomething()
- 删除引用,即使用
std::move(myUniquePtr)
或当std::shared_ptr
超出范围时。
就我而言,我没有同时从多个线程访问这些指针。我只是好奇我是否可以在高优先级、无锁线程上专门使用它们。指针管理的对象在高优先级回调之前由主线程分配,在回调停止之前不会释放。
谢谢!
通过合理的实现,您可以假设:
标准::unique_ptr:
- std::unique_ptr 上的所有操作都与原始指针上的相应操作一样无锁,因为并发性没有什么特殊之处。
标准::shared_ptr:
- 所有不更改引用计数的操作都与原始指针上的相应操作一样无锁。这包括取消引用和移动构造的操作。
- std::move 是无锁的,因为它只是对右值引用的强制转换。
- std::shared_ptr 的析构函数至少与
std::atomic<std::size_t>
一样无锁(可以使用成员函数is_lock_free
进行检查)。 - 移动分配取决于左侧的 std::shared_ptr 是否具有关联的托管对象。如果存在关联的托管对象,则它与析构函数一样无锁。否则,它与移动构造函数一样无锁,因为引用计数不会更改。
标准所说的只是对于shared_ptr<>
(20.7.2.2/4"类模板shared_ptr"):
use_count()
的更改不反映可以 引入数据竞赛
它并没有说use_count()
中的这些变化必须是无锁的。 该标准允许使用互斥锁来防止数据竞争。
unique_ptr<>
没有承诺防止数据竞争(它本身并不打算是线程安全的)。
相关文章:
- 如何检查线程是否锁定
- C++ 11 中的锁定是否保证访问数据的新鲜度?
- 同一互斥锁顺序上的锁定和解锁是否一致?
- 共享内存的升压容器是否实现锁定?
- 获取大小时是否必须锁定 std::queue?
- 我是否需要在 OpenSSL 1.1.0+ 中使用加密锁定函数来实现线程安全?
- 确定 SQLite 数据库是否已锁定
- 是否有必要锁定
- 锁定的互斥锁是否保护condition_variable和数据?
- C 删除对象,是否锁定
- 托管语言是否锁定本机库的刷新和重新加载变量?
- 是否可以锁定应用程序中常见控件使用的内存?
- 如何判断虚拟内存页是否已锁定
- 如何测试文件是否被锁定和/或只读而不打开?
- 如何判断当前过程是否已经锁定文件
- 我是否必须锁定我刚刚枚举的向量,或者我只在更改它时才这样做?
- 通知线程是否始终需要在修改期间锁定共享数据
- 如果其对象在多个线程中运行,我们是否需要锁定类成员功能
- 我的双重检查锁定模式实现是否正确?
- boost中是否有允许写偏锁定的功能