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

STL containers and threads (concurrent writes) in Linux

本文关键字:并发 线程 中的 STL Linux      更新时间:2023-10-16

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

规范的做法是什么?一个简单的例子:

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

如何保证并发?

mutex_lock;
write at myMap;
mutex_unlock;

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

系统:linux, g++, pthreads,无boost,无Intel TBB

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

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

由于STL容器不提供任何显式的线程安全,所以你必须使用自己的同步机制。当你在它的时候,你应该使用RAII而不是手动管理同步资源(互斥锁解锁等)。

你可以参考这里的文档:

MSDN:

如果一个线程正在写一个对象,那么在相同或其他线程上对该对象的所有读写都必须受到保护。例如,给定一个对象A,如果线程1正在写A,那么线程2必须被阻止读写A。

GCC Documentation说:
我们目前使用的是SGI STL对线程安全的定义,该定义如下:

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

注释:GCC的标准库是SGI的STL代码的派生。

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

在90%对集合的访问不是性能关键的情况下都有效。如果您访问共享集合的次数太多,以至于锁定它会损害性能,那么您应该重新考虑您的设计。(而且很有可能,你的设计是好的,它不会像你想象的那样影响性能。)

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