stl map查找线程安全

时间:2011-05-06 14:01:56

标签: c++ multithreading stl map thread-safety

stl map thread上的find调用是否安全?

4 个答案:

答案 0 :(得分:13)

不,C ++规范不保证任何STL容器上的操作规范中的线程安全性。如果线程安全很重要,那么您应该提供自己的锁定。

话虽如此,不同的实现似乎提供了不同的保证。例如,大多数似乎允许多个并发读取器,只要不同时执行写入。如果您不关心可移植性,可以研究实现的文档。例如,来自here的SGI STL:

  

STL的SGI实现是   线程安全只在某种意义上说   同时访问不同的   容器是安全的,同时的   读取对共享容器的访问   很安全。如果多个线程访问a   单个容器,至少一个   线程可能会写,然后   用户负责确保   线程之间相互排斥   在容器访问期间。

this answer开始,Dinkumware似乎也提出了类似的保证(他们制作了微软的STL实现)。

  

多个线程可以安全地读取   相同的容器对象。 (有   nunprotected可变子对象   容器对象。)

     

两个线程可以安全地操作   不同的容器对象   相同的类型。 (没有不受保护的   共享静态对象   容器类型。)

     

你必须防止同时发生   访问容器对象,如果在   至少有一个线程正在修改   宾语。 (明显的同步   原语,例如那些   Dinkum Threads Library,不会   被容器对象破坏。)

答案 1 :(得分:3)

否:当另一个线程与您的find同时更新地图时,行为未定义。

答案 2 :(得分:3)

我试图找到问题的答案。

https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-3.4/stl__map_8h-source.html

你可以看到stl map souce。

搜索find()。它发现于497行,524行。代码写为_M_t.find(__x);

然后搜索_M_t

它在124行中找到。 它写成_Rep_type _M_t;

如果每个线程都创建了属性_M_t,那么它可以是线程安全的。 但我不这么认为。 如果2个线程同时使用find,它们将同时使用_M_t_Rep_type已与_Rb_tree相关联。

您可以在以下来源中看到_Rb_tree

https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.1/stl__tree_8h-source.html

find()进行树木旅行(见下面的代码)。 <{1}}和__x中不会发生变化。

__y

答案 3 :(得分:0)

实际上,Microsoft Visual Studio 2008附带的STL似乎对修改地图的操作有一些锁定(我认为它与set相同)。这是相当烦人的,因为我正在多个线程中构建更多的地图,这正在扼杀我的表现。