【问题标题】:C++ concurrent associative containers?C ++并发关联容器?
【发布时间】:2010-03-01 16:28:59
【问题描述】:

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

基本上我有这个设置:

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

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

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

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

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

【问题讨论】:

    标签: c++ concurrency hashmap nonblocking


    【解决方案1】:

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

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

    【讨论】:

    • 甜,我会看看那个。我宁愿找到一个免费的实现(我希望在工作中使用它),但这是我在合法库中看到的唯一并发容器实现(而不是一些随机家伙博客的代码)。
    • 它是 GPL。这还不够免费吗?
    • 哎呀。是的,在阅读了网站之后,除非您想要他们的支持包,否则它看起来即使用于商业用途也是免费的。而且它不是无锁的,它使用细粒度锁定,但看起来它表现得非常好,我肯定会针对我现在使用的东西做一些基准测试(std::map with course grained locking)。
    【解决方案2】:

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

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

    【讨论】:

    • 我绝对没有考虑调整大小的问题,哎呀。在我看来,应该有一个不涉及调整大小的完整副本的解决方案。它可能涉及保留一组哈希表,当您用完空间时添加这些表。不完全确定这会对性能产生什么影响,但我觉得我以前在其他地方看到过这种效果。
    猜你喜欢
    • 1970-01-01
    • 2021-02-18
    • 2011-12-10
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多