2

我正在寻找某种关联容器,它提供安全的并发读写访问,前提是您永远不会同时读写相同的元素。

基本上我有这个设置:

线程 1:创建 A,将 A 写入容器,通过网络发送 A。

线程 2:接收 A 的响应,从容器中读取 A,做一些处理。

我可以保证我们只写一次 A,尽管我们可能会收到多个 A 的响应,这些响应将被串行处理。这也保证了我们永远不会同时读取和写入 A,因为我们只有在发送 A 之后才能收到对 A 的响应。

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

我认为std::hash_map或者boost::unordered_set可能适用于此,只是基于我的假设,即普通的哈希表实现将满足我的标准,但我并不积极,我找不到任何可以告诉我的文档。有没有其他人尝试过类似地使用这些?

4

2 回答 2

1

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

concurrent_hash_map来自TBB的呢?我在这个相关的 SO question中发现了这一点。

于 2010-03-01T17:04:35.427 回答
0

当存储元素的数量增加时,常见的哈希表实现会重新散列,所以这可能不是一个选项,除非你知道这不会发生。

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

于 2010-03-01T16:36:38.763 回答