C++智能指针是否无锁定

Are C++ smart pointers lockfree?

本文关键字:锁定 是否 指针 智能 C++      更新时间:2023-10-16

以下操作对std::unique_ptr和/或std::shared_ptr是否无锁定?

  1. 取消引用,即 read(*myPtr)myPtr->getSomething()
  2. 删除引用,即使用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<>没有承诺防止数据竞争(它本身并不打算是线程安全的)。