【问题标题】:Converting from boost unordered to tbb concurrent hash map从 boost unordered 转换为 tbb 并发 hash map
【发布时间】:2014-03-24 22:11:10
【问题描述】:

我对 C++ 很陌生,我一直在寻找关于 tbb 并发哈希映射的初学者教程,但徒劳无功。我一直在我的 C++ 程序中使用 boost 无序哈希映射,现在我想使用 tbb 的并发哈希映射,因为多个线程将同时写入哈希映射。

我在boost的hash map上做如下四个操作:

typedef boost::unordered_map<string, std::vector<int> > MAP;
MAP myMap;
  1. 插入我的地图:

    string key = "somestring"
    int somevalue = 1 
    myMap[key].push_back(somevalue);
    
  2. 遍历 myMap 中的所有键:

    BOOST_FOREACH(MAP::value_type pair, myMap)
    {
            string key  = pair.first;
    }
    
  3. 返回与键关联的值:

    MAP::const_iterator iter = myMap.find("somekey");
    

如何实现1、2、3,使用tbb并发hash map?请注意,我只执行 2 和 3 所有线程都完成了它们的插入

【问题讨论】:

    标签: c++ hashmap tbb


    【解决方案1】:

    您应该能够简单地将您的 typedef 更改为 typedef tbb::concurrent_unordered_map&lt;string, std::vector&lt;int&gt; &gt; MAP; 并安全地使用具有多个线程的容器。

    insert、iterators (begin .. end) 和 find 方法都以相同的方式工作,但与 unordered_map 不同的是,它们是线程安全的。

    【讨论】:

    • ..除非需要并发擦除(),因为它在 tbb::concurrent_unordered_map 中不是线程安全的
    • 如果是这样,那为什么 tbb 分别有用于插入和查找的访问器和常量访问器??
    • @NewToAndroid,不要将 concurrent_hash_map(带有 erase() 和访问器)与 concurrent_unordered_map(带有 unsafe_erase() 和迭代器而不是访问器)混合
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2022-12-05
    • 1970-01-01
    • 2017-05-08
    • 2016-08-16
    • 2011-09-01
    相关资源
    最近更新 更多