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

时间:2014-04-08 03:36:18

标签: c++ multithreading c++11 smart-pointers lock-free

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

  1. 解除引用,即read(*myPtr)myPtr->getSomething()
  2. 删除引用,即使用std::move(myUniquePtr)std::shared_ptr超出范围时。
  3. 就我而言,我不会同时从多个线程访问这些指针。我只是好奇我是否可以在高优先级,无锁线程上专门使用它们。由指针管理的对象在高优先级回调之前由主线程分配,并且在回调停止之前不会被释放。

    谢谢!

2 个答案:

答案 0 :(得分: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是否具有关联的托管对象。如果存在关联的托管对象,则它与析构函数一样无锁。否则它与移动构造函数一样无锁,因为引用计数不会更改。

答案 1 :(得分:2)

标准所说的是shared_ptr<>(20.7.2.2/4“类模板shared_ptr”)的所有内容:

  

use_count()中的更改未反映可以进行的修改   介绍数据竞赛

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

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