在下面的代码中,如果我不释放a1
,代码似乎陷入map.find
函数内的无限循环中。
如果我需要在应用程序的两个不同部分中搜索元素,该怎么办?
#include <iostream>
#include "tbb/concurrent_hash_map.h"
using namespace std;
using namespace tbb;
void main()
{
concurrent_hash_map<int, int> map;
concurrent_hash_map<int, int>::accessor a1, a2;
map.insert(make_pair(1, 111));
cout << "a1 - " << map.find(a1, 1) << endl;
//a1.release();
cout << "a2 - " << map.find(a2, 1) << endl;
}
答案 0 :(得分:8)
访问者允许写访问。这意味着获取写锁定,并且仅由一个访问器保持。您输入死锁是因为同一个线程试图锁定相同的元素以便通过不同的访问器进行写入。
如果您只想读取数据,请使用const_accessor
和find
。它只会获得一个读锁定。可以获取并保持多个读锁,而不会发生死锁。
concurrent_hash_map<int, int>::const_accessor a1, a2;