为什么我不能为 tbb 哈希映射中的同一元素设置两个访问器?
Why can't I have two accessors for the same element in tbb hash map?
在下面的代码中,如果我不释放 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;
}
访问器允许写访问。这意味着一个写锁被获取,并且只被一个访问者持有。您进入死锁是因为同一个线程试图锁定同一个元素以通过不同的访问器进行写入。
如果您只想读取 数据,则使用 const_accessor
和 find
。它只会获得一个读锁。可以获取并持有多个读锁而不会死锁。
concurrent_hash_map<int, int>::const_accessor a1, a2;
在下面的代码中,如果我不释放 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;
}
访问器允许写访问。这意味着一个写锁被获取,并且只被一个访问者持有。您进入死锁是因为同一个线程试图锁定同一个元素以通过不同的访问器进行写入。
如果您只想读取 数据,则使用 const_accessor
和 find
。它只会获得一个读锁。可以获取并持有多个读锁而不会死锁。
concurrent_hash_map<int, int>::const_accessor a1, a2;