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

mxd*_*ois 5 c++ multithreading smart-pointers lock-free c++11

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

  1. 解除引用,即read(*myPtr)或myPtr->getSomething()
  2. 删除引用,即使用std::move(myUniquePtr)或当std::shared_ptr超出范围时.

就我而言,我不会同时从多个线程访问这些指针.我只是好奇我是否可以在高优先级,无锁线程上专门使用它们.由指针管理的对象在高优先级回调之前由主线程分配,并且在回调停止之前不会被释放.

谢谢!

nos*_*sid 5

通过合理的实施,您可以假设:

std :: unique_ptr:

  • std :: unique_ptr上的所有操作都与原始指针上的相应操作一样无锁,因为并发性没有什么特别之处.

std :: shared_ptr:

  • 所有不更改引用计数的操作都与原始指针上的相应操作一样无锁.这包括解除引用和移动构造的操作.
  • std :: move是无锁的,因为它只是对rvalue-reference的强制转换.
  • std :: shared_ptr的析构函数至少与无锁定一样std::atomic<std::size_t>(可以使用成员函数进行检查is_lock_free).
  • 移动赋值取决于左侧的std :: shared_ptr是否具有关联的托管对象.如果存在关联的托管对象,则它与析构函数一样无锁.否则它与移动构造函数一样无锁,因为引用计数不会更改.


Mic*_*urr 3

标准所说的只是对于shared_ptr<>(20.7.2.2/4“类模板shared_ptr”):

的更改use_count()并不反映可能引入数据竞争的修改

它并没有说这些更改use_count()必须是无锁的。该标准允许使用互斥锁来防止数据竞争。

unique_ptr<>没有承诺防止数据竞争(它本身并不是线程安全的)。