我正在寻找使用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/ )。 他们有一些非常优化的数据结构,使用非阻塞策略处理内部并发。