Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ tbb::concurrent_hash_map-如果密钥条目被其他线程阻止,如何返回_C++_Multithreading_Hashmap_Tbb - Fatal编程技术网

C++ tbb::concurrent_hash_map-如果密钥条目被其他线程阻止,如何返回

C++ tbb::concurrent_hash_map-如果密钥条目被其他线程阻止,如何返回,c++,multithreading,hashmap,tbb,C++,Multithreading,Hashmap,Tbb,我正在编写一个程序,其中多个线程向(tbb::concurrent_hash_map)散列映射添加条目,同时其他线程遍历该映射并操作散列映射上的条目。每次一个线程操作一个条目并使用一个访问器阻止该条目(这样就不会有冲突,其他线程也不能访问该条目)。在处理数据之后,线程插入数据并释放访问器 我现在的问题是,即使散列映射上的其他条目没有被阻止,线程如何访问被阻止的条目也会一直等到该条目的访问者被释放。我想要实现的目标是,线程跳过阻止的条目,转到下一个非阻止的条目或返回到我的函数。有好的解决办法吗 以

我正在编写一个程序,其中多个线程向(tbb::concurrent_hash_map)散列映射添加条目,同时其他线程遍历该映射并操作散列映射上的条目。每次一个线程操作一个条目并使用一个访问器阻止该条目(这样就不会有冲突,其他线程也不能访问该条目)。在处理数据之后,线程插入数据并释放访问器

我现在的问题是,即使散列映射上的其他条目没有被阻止,线程如何访问被阻止的条目也会一直等到该条目的访问者被释放。我想要实现的目标是,线程跳过阻止的条目,转到下一个非阻止的条目或返回到我的函数。有好的解决办法吗

以下代码段为简短的单线程示例:

...
typdef tbb::concurrent_hash_map<int,unsigned int> typ_hash_map;
typ_hash_map hash_map;
typ_hash_map::accessor acc;
typ_hash_map::accessor acc2;
//hash_map filled with 4 entries...

//block second entry in hash map
typ_hash_map::iterator k = hash_map.begin();
k++;
config.hash_map.insert(acc,k->first);

//travers all entries in hash_map
for(typ_hash_map::iterator j = hash_map.begin();j!=hash_map.end(); j++){
           hash_map.find(acc2,j->first); // my problem: return if entry is blocked - at the moment its waiting till acc is released
            /*
            Do something with acc2->second if entry is not blocked, 
            else continue;
            */
          }
...
。。。
typdef tbb::并发哈希映射typ\u hash\u map;
典型哈希映射哈希映射;
类型散列映射::访问器acc;
类型散列映射::访问器acc2;
//哈希_映射填充了4个条目。。。
//阻止哈希映射中的第二个条目
typ_hash_map::迭代器k=hash_map.begin();
k++;
config.hash_map.insert(acc,k->first);
//遍历哈希映射中的所有条目
for(typ_hash_map::iterator j=hash_map.begin();j!=hash_map.end();j++){
hash_map.find(acc2,j->first);//我的问题:如果条目被阻止,返回-此时等待acc被释放
/*
如果条目未被阻止,请使用acc2->second执行操作,
否则继续;
*/
}
...

您知道遍历
tbb::concurrent\u hash\u map
不是线程安全的吗?如果您的代码是串行的,那么就没有什么需要保护的了:因此,您不需要持有访问器

在任何情况下,长时间锁定一个元素都是一个坏主意,因为它会损害可伸缩性并导致像您一样的死锁。当更新完成或读取数据时,应该立即释放该元素

并发\u哈希\u映射的一般规则是:在保持第一个访问的同时,不要在其他访问上运行任何哈希表操作


因此,只要在完成访问后立即释放访问器
acc
acc.release()
您知道遍历
tbb::concurrent\u hash\u map
不是线程安全的吗?如果您的代码是串行的,那么就没有什么需要保护的了:因此,您不需要持有访问器

在任何情况下,长时间锁定一个元素都是一个坏主意,因为它会损害可伸缩性并导致像您一样的死锁。当更新完成或读取数据时,应该立即释放该元素

并发\u哈希\u映射的一般规则是:在保持第一个访问的同时,不要在其他访问上运行任何哈希表操作

因此,只要在完成访问器
acc
后立即释放它:
acc.release()