我正在寻找使用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
答案 0 :(得分:5)
C ++ 03标准根本不讨论并发性,因此并发性方面被省略为编译器的实现细节。因此,编译器附带的文档是应该寻找与并发相关的答案的地方。
大多数STL实现都不是线程安全的。
由于STL容器不提供任何明确的线程安全性,因此您必须使用自己的同步机制。当您使用 时,
您可以在此处参考文档:
如果一个线程正在写入单个对象,则必须保护对相同或其他线程上该对象的所有读写操作。例如,给定一个对象A,如果线程1写入A,则必须阻止线程2读取或写入A。
MSDN: 说:
我们目前使用线程安全的 GCC Documentation 定义,其中声明:
STL的SGI实现仅在对不同容器的同时访问是安全的意义上是线程安全的,并且对共享容器的同时读取访问是安全的。如果多个线程访问单个容器,并且至少有一个线程可能写入,则用户有责任确保在容器访问期间线程之间的互斥。
注意事项:GCC的标准库是SGI的STL代码的衍生物。
答案 1 :(得分:0)
提供并发性的规范方法是在访问集合时保持锁定。
在90%的情况下,无论如何,对集合的访问权限都不是性能关键的。如果您正在访问共享集合以至于锁定它会损害性能,那么您应该重新考虑您的设计。 (可能的情况是,你的设计还可以,并且它不会影响你可能怀疑的任何地方的性能。)
答案 2 :(得分:0)
你应该看一下intel线程构建块tbb(http://threadingbuildingblocks.org/)。它们有一些非常优化的数据结构,可以使用非阻塞策略在内部处理并发。