【问题标题】:why is std::shared_ptr using atomic cpu operations为什么 std::shared_ptr 使用原子 cpu 操作
【发布时间】:2012-01-23 23:56:55
【问题描述】:

我无法理解为什么 shared_ptr 使用原子 cpu 指令...我无法弄清楚原因,因为它不是线程安全的。 谁能解释一下。

如果您想知道我是如何知道它使用原子指令的:有一个来自 C++ 及其他领域的剪辑,Herb 和 Andrei 谈论它,但他们从未提及为什么会这样。

【问题讨论】:

    标签: c++ c++11 shared-ptr atomic


    【解决方案1】:

    shared_ptr 的任何实例都是多线程安全的。它指向的数据不是多线程安全的。见this

    如果应用得当(通过竞争线程访问以相同顺序完成保护),原子指令是实现线程安全的一种方式。另一种方法是使用互斥体。

    查看关于 BOOST 的类似问题:Is boost shared_ptr xxx thread safe?

    【讨论】:

    • 更具体地说:shared_ptr 内部的共享引用计数可以被多个线程访问。这就是为什么有必要以原子方式递增/递减它。
    • 这个答案有点误导; shared_ptr 操作不是原子的,因此从一个线程写入同一个 shared_ptr 实例而在另一个线程中读取它实际上并不安全。控制块是 shared_ptr 唯一的线程安全部分。
    【解决方案2】:

    Herb Sutter 刚刚在他的 gotw 95 中使用了 shared_ptr 作为一个很好的例子,他去那里详细说明了设计决策:
    https://herbsutter.com/2014/01/13/gotw-95-solution-thread-safety-and-synchronization/

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 (而且我懒得做这项工作)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 2011-08-20
    • 2019-04-18
    • 2014-08-06
    • 2014-09-17
    • 1970-01-01
    相关资源
    最近更新 更多