boost :: shared_ptr在多个线程中使用它是否安全?

use*_*475 7 c++ multithreading boost shared-ptr

我试图找到答案一段时间,但我失败了.

让我们假设我们有一个shared_ptr从一个线程创建.然后我们将它传递shared_ptr给另外2个线程(例如使用一些队列).所以从这一刻开始,有两份原件shared_ptr,指向同一个原始指针.两个所有者线程都shared_ptr将从队列中获取它们的副本.然后他们会将它传递给另一个线程或将其销毁.

问题是 - 它安全吗?原始指针是否会被正确销毁(没有竞争引用计数器?) 在此输入图像描述

Kon*_*lph 9

C++标准几乎不保证线程安全.引用计数std::shared_ptr是唯一的例外:它保证表现为原子访问的变量.我认为这是在§20.7.2.2/ 4中的这句话中编纂的:

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

boost::shared_ptr 提供相同的保证:

shared_ptr对象提供与内置类型相同的线程安全级别.shared_ptr实例可以由多个线程同时"读取"....不同的shared_ptr实例可以被多个线程同时"写入"...(即使这些实例是副本,并在下面共享相同的引用计数.)

  • "shared_ptr"没有特定的保证.保证适用于每个标准类. (2认同)

Fra*_*ser 5

升压文档状态:

不同的shared_ptr实例可以被多个线程同时"写入"(使用诸如operator =或reset之类的可变操作访问)(即使这些实例是副本,并在下面共享相同的引用计数.)

(强调我的)

因此,这里的关键是你是否复制boost::shared_ptr线程或不s之间.如果您创建副本(使用shared_ptrs 的"安全"方式),您不必担心线程安全.但是,如果您传递shared_ptr引用引用或指针,因此shared_ptr在不同的线程中使用实际相同的内容,则必须担心线程安全性,如文档中所述.