存储在共享指针中的对象的线程安全性

时间:2012-08-23 23:51:57

标签: c++ shared-ptr

我有一个boost::shared_ptr<Map>,这个地图正被多个线程修改,我是否需要使用显式互斥,或者只是线程通过共享指针修改地图的事实,我会得到某种隐含的线程安全?

2 个答案:

答案 0 :(得分:2)

Did you even look at the docs?

  

shared_ptr对象提供与内置相同级别的线程安全性   类型。 shared_ptr实例可以“读取”(仅使用const访问)   操作)由多个线程同时进行。不同的shared_ptr   实例可以“写入”(使用可变操作访问)   多个线程同时执行operator =或reset)(即使是   这些实例是副本,并共享相同的引用计数   的下面。)

     

任何其他同步访问都会导致未定义的行为。

编辑:看起来你问的是指向的对象,而不是指针本身。在这种情况下,根本没有线程安全gaurentees。为什么会这样?

答案 1 :(得分:1)

shared_ptr具有与内置类型相同的线程安全级别。

您可以同时从多个线程执行read(const)操作。

您还可以同时从多个线程对不同的operator=实例执行写操作(即使用resetshared_ptr等可变操作)。这包括这些实例共享相同引用计数的情况(因为shared_ptr为ref计数器提供原子递增/递减)。

如果您需要任何其他类型的访问权限,则需要同步它,否则您将获得未定义的行为。