Linux中的STL容器和线程(并发写入)

cat*_*eof 2 c++ linux concurrency stl pthreads

我正在寻找使用STL容器(如std :: map和std :: vector)和pthreads的最佳策略.

什么是规范的方式?一个简单的例子:

std::map<string, vector<string>> myMap;
Run Code Online (Sandbox Code Playgroud)

我们如何保证并发?

mutex_lock;
write at myMap;
mutex_unlock;
Run Code Online (Sandbox Code Playgroud)

另外,我想知道pthreads和STL在一起使用时是否会遇到性能问题.

系统:Liunx,g ++,pthreads,没有提升,没有Intel TBB

Alo*_*ave 5

C++ 03标准根本不讨论并发性,因此并发性方面被省略为编译器的实现细节.因此,编译器附带的文档是应该查找与并发相关的答案的地方.

大多数STL实现都不是线程安全的.

由于STL容器不提供任何明确的线程安全性,因此您必须使用自己的同步机制.当你在它时你应该使用RAII而不是手动管理同步资源(互斥锁解锁等).

你可以在这里参考文献:

MSDN:

如果一个线程正在写入单个对象,则必须保护对相同或其他线程上该对象的所有读写操作.例如,给定对象A,如果线程1写入A,则必须阻止线程2读取或写入A.

GCC文档 说:
我们目前使用 SGI STL线程安全定义,其中规定:

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

注意:GCC的标准库是SGI的STL代码的衍生物.