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

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

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

std::map<string, vector<string>> myMap; 

我们如何保证并发?

 mutex_lock; write at myMap; mutex_unlock; 

另外,我想知道pthreads和STL在一起使用时是否面临性能问题。

系统:Liunx,g ++,pthreads,没有提升,没有英特尔TBB

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

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

由于STL容器不提供任何明确的线程安全性,所以是的,你将不得不使用你自己的同步机制。 而你在这个时候你应该使用RAII而不是手动管理同步资源(互斥锁等)。

您可以在这里参考文档:

MSDN:

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

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

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

注意:GCC的标准库是SGI STL代码的衍生产品。

提供并发性的规范方式是在访问集合时保持锁定。

无论如何,在90%的情况下,这种方式对收集的访问没有影响性能。 如果您访问的共享收藏太多,锁定它会损害性能,您应该重新考虑您的设计。 (可能性是,你的设计是可以的,它不会影响你接近的性能。

你应该看看英特尔线程构建模块tbb( http://threadingbuildingblocks.org/ )。 他们有一些非常优化的数据结构,使用非阻塞策略处理内部并发。