stl map查找线程安全

Maa*_*anu 13 c++ multithreading stl map thread-safety

在stl map线程上找到调用是否安全?

Dou*_* T. 13

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

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

STL的SGI实现仅在对不同容器的同时访问是安全的意义上是线程安全的,并且对共享容器的同时读取访问是安全的.如果多个线程访问单个容器,并且至少有一个线程可能写入,则用户负责确保在容器访问期间线程之间的互斥.

这个答案来看,Dinkumware似乎也提出了类似的保证(他们制作了微软的STL实现).

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

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

如果至少有一个线程正在修改对象,则必须防止同时访问容器对象.(明显的同步原语,例如Dinkum线程库中的原语,不会被容器对象破坏.)


Fre*_*Foo 5

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