Linux中的STL容器和线程(并发写)
STL containers and threads (concurrent writes) in Linux
我正在寻找使用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/)。他们有一些非常优化的数据结构,使用非阻塞策略在内部处理并发。
- 并发/多线程:是否可以以这种方式生成相同的输出?
- 琐碎并发代码的吞吐量不会随着线程数量的增加而增加
- 由并发无序映射查找线程调用的函数是否安全?
- 如何在 qt 中从另一个线程运行 qt并发时关闭程序
- 并发问题:如何只有一个线程通过关键部分
- 在iOS设备上执行并发任务时如何设置正确的线程数?
- 在C 多线程应用程序中,设置了并发线程的最大数量
- std ::线程最大并发线程
- 根据硬件并发性将任务平均划分为线程
- C++ 并发队列:速度较慢,> 1 个线程
- 并发线程中的 C++ 类对象
- 从 std::d eque 线程对 emplace_back() 和运算符 []() 的并发调用是否安全?
- Windows7内存管理 - 如何防止并发线程阻止
- 在没有"线程管理"的情况下C++设置并发哈希表/哈希?
- 读取另一个线程中并发运行的 pthread 的本地数据
- C++多线程使用并发变量停止线程
- 管理多个并发线程
- C++ 操作 9.6 线程池中的并发使用thread_local
- 使用 VS2010 并发运行时消息在非运行时线程上传递类(unbounded_buffer 等)
- Pthread_create错误11,只有5个并发线程