我正在寻找某种类型的关联容器,它提供安全的并发读取和放大器。如果您从未同时读取和写入相同的元素,则可以进行写访问。
基本上我有这个设置:
主题1:创建A,将A写入容器,通过网络发送A.
主题2:接收来自A的回复,从容器中读取A,进行一些处理。
我可以保证我们只会写一次A,但我们可能会收到A的多个响应,这些响应将被串行处理。这也保证了我们不会同时读写A,因为我们只能在发送后收到对A的响应。
所以基本上我正在寻找一个容器,其中写入元素不会混淆任何其他元素。例如,std::map
(或任何其他基于树的实现)不满足此条件,因为其底层实现是红黑树,因此任何给定的写入可以重新平衡树并炸掉任何并发读取操作。
我认为std::hash_map
或boost::unordered_set
可能对此有用,只是基于我的假设,即普通的哈希表实现符合我的标准,但我不是肯定的,我找不到任何会告诉我的文件。还有其他人尝试过这类似的吗?
答案 0 :(得分:1)
STL不会对线程提供任何可靠的保证,因为C ++标准根本没有提到线程。我不知道有关提升的信息,但如果它的容器有任何并发保证,我会感到惊讶。
来自TBB的concurrent_hash_map
怎么样?我在this related SO question找到了这个。
答案 1 :(得分:0)
当存储元素的数量增加时,公共哈希表实现会重新进行,因此如果您知道这不会发生,则可能不是一个选项。
我会看一下用于函数式语言的结构(例如看http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf),但请注意我正在考虑的那些依赖于垃圾收集。