TBB ThreadingBuildingBlocks奇怪的行为

时间:2012-07-08 17:45:36

标签: multithreading data-structures tbb concurrenthashmap

我的问题:如果我使用“只读”const_accessors,为什么我的程序会冻结?

似乎是锁定,从API描述看似可以有一个访问器和多个const_accessors,(编写器,阅读器)。也许有人可以告诉我一个不同的故事。

我尝试实现的目标是使用此并发哈希映射并使其可用于10-200个线程,以便它们可以查找和添加/删除信息。如果你有一个比我现在使用的更好的解决方案,你也欢迎发布替代方案。

tbb::size_t hashInitSize = 1200000;
concurrent_hash_map<long int,char*> hashmap(hashInitSize);
cout << hashmap.bucket_count() << std::endl;

long int l = 200;
long int c = 201;

    concurrent_hash_map<long int,char*>::accessor o;
    concurrent_hash_map<long int,char*>::const_accessor t;
    concurrent_hash_map<long int,char*>::const_accessor h;

    cout << "Trying to find 200 "<< hashmap.find(t,200) << std::endl;

    hashmap.insert(o,l);
o->second = "testother";

TBB Community Tutorial Guide描述了访问者的概念

1 个答案:

答案 0 :(得分:1)

来自TBB reference manual

  

访问者充当concurrent_hash_map中对的智能指针。它保持对一对的隐式锁,直到实例被销毁或在访问器上调用方法release

访问者在使用时获取锁定。多个访问者可以同时存在。但是,如果程序同时使用多个访问器并且不释放锁,则可能会死锁。

要避免死锁,请在完成访问后释放哈希映射条目上的锁。