C ++并发关联容器?

时间:2010-03-01 16:28:59

标签: c++ concurrency hashmap nonblocking

我正在寻找某种类型的关联容器,它提供安全的并发读取和放大器。如果您从未同时读取和写入相同的元素,则可以进行写访问。

基本上我有这个设置:

主题1:创建A,将A写入容器,通过网络发送A.

主题2:接收来自A的回复,从容器中读取A,进行一些处理。

我可以保证我们只会写一次A,但我们可能会收到A的多个响应,这些响应将被串行处理。这也保证了我们不会同时读写A,因为我们只能在发送后收到对A的响应。

所以基本上我正在寻找一个容器,其中写入元素不会混淆任何其他元素。例如,std::map(或任何其他基于树的实现)不满足此条件,因为其底层实现是红黑树,因此任何给定的写入可以重新平衡树并炸掉任何并发读取操作。

我认为std::hash_mapboost::unordered_set可能对此有用,只是基于我的假设,即普通的哈希表实现符合我的标准,但我不是肯定的,我找不到任何会告诉我的文件。还有其他人尝试过这类似的吗?

2 个答案:

答案 0 :(得分:1)

STL不会对线程提供任何可靠的保证,因为C ++标准根本没有提到线程。我不知道有关提升的信息,但如果它的容器有任何并发​​保证,我会感到惊讶。

来自TBBconcurrent_hash_map怎么样?我在this related SO question找到了这个。

答案 1 :(得分:0)

当存储元素的数量增加时,公共哈希表实现会重新进行,因此如果您知道这不会发生,则可能不是一个选项。

我会看一下用于函数式语言的结构(例如看http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf),但请注意我正在考虑的那些依赖于垃圾收集。