STL Map或HashMaps线程是否安全?

时间:2010-08-09 05:03:10

标签: c++ stl

我可以在多线程程序中使用map或hashmap而无需锁定吗? 即他们是安全的吗?

我想要同时在地图上添加和删除。

那里似乎有很多相互矛盾的信息。

顺便说一句,我在Ubuntu 10.04下使用GCC附带的STL库

编辑:就像互联网的其他部分一样,我似乎得到了相互矛盾的答案?

5 个答案:

答案 0 :(得分:14)

您可以安全地执行同时读取操作,即调用const成员函数。但是如果其中一个涉及写入,则不能同时进行任何操作,即非const成员函数的调用对于容器应该是唯一的,并且不能与任何其他调用混合。

即。你无法从多个线程更改容器。所以你需要使用lock / rw-lock 使访问安全。

答案 1 :(得分:4)

没有

诚实。否。

修改

好的,我会对它进行鉴定。

您可以使用任意数量的线程读取同一个地图。这是有道理的,因为阅读它没有任何副作用,所以其他人是否也在做这件事并不重要。

但是,如果要写入它,那么您需要获得独占访问权限,这意味着在完成之前,阻止任何其他线程写入读取。

您最初的问题是关于并行添加和删除。由于这些都是写入,因此它们是否是线程安全的答案是一个简单,明确的“否”。

答案 2 :(得分:4)

TBB是一个免费的开源库,提供了线程安全的关联容器。 (http://www.threadingbuildingblocks.org/

答案 3 :(得分:2)

最常用的STL容器线程安全模型是SGI一个:

  

STL的SGI实现仅在某种意义上是线程安全的   同时访问不同的   容器是安全的,同时的   读取对共享容器的访问   很安全。

但最终由STL库作者决定--AFAIK标准对STL的线程安全没有任何说明。

但是根据docs GNU的stdc ++实现遵循它(从gcc 3.0+开始),如果满足许多条件。

HIH

答案 4 :(得分:0)

答案(像大多数线程问题一样)是大部分时间都可以使用。不幸的是,如果你在调整大小时抓住地图,那么你最终会遇到麻烦。所以没有。

为了获得最佳性能,您需要一个多级锁定。首先是一个读锁,它允许访问者不能修改地图,并且可以由多个线程保存(多个线程读取项目都可以)。其次是一个独占的写锁,允许以不安全的方式修改地图(添加,删除等)。

编辑读写器锁是好的,但它们是否优于标准互斥锁取决于使用模式。我不能不知道更多的建议。对两者进行分析,看看哪种最适合您的需求。