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

时间:2011-11-01 17:08:58

标签: c++ linux stl concurrency pthreads

我正在寻找使用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

3 个答案:

答案 0 :(得分:5)

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

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

由于STL容器不提供任何明确的线程安全性,因此您必须使用自己的同步机制。当您使用 时,

您可以在此处参考文档:

RAII

  

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

MSDN: 说:
我们目前使用线程安全的 GCC Documentation 定义,其中声明:

  

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

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

答案 1 :(得分:0)

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

在90%的情况下,无论如何,对集合的访问权限都不是性能关键的。如果您正在访问共享集合以至于锁定它会损害性能,那么您应该重新考虑您的设计。 (可能的情况是,你的设计还可以,并且它不会影响你可能怀疑的任何地方的性能。)

答案 2 :(得分:0)

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