2017-07-24 83 views
8

在下面的代码中,如果我没有发布a1,代码似乎陷入map.find函数内部的无限循环中。为什么我不能在tbb哈希映射中为同一个元素使用两个访问器?

如果我需要在应用程序的两个不同部分搜索元素,该怎么办?

#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; 
} 

回答

8

访问者允许写访问。这意味着获得写锁,并且只由一个访问器保存。您输入死锁是因为同一个线程试图锁定相同的元素以通过不同的访问器进行写入。

如果您只想要读取的数据,然后使用const_accessorfind。它只会获取一个读锁。可以获取并保持多个读锁,而不会发生死锁。

concurrent_hash_map<int, int>::const_accessor a1, a2; 
+0

非常感谢! – Jack

+0

是否有可能以某种方式同时有一个const_accessor和一个访问器? – Jack

+1

@Jack - 否。在没有人正在读取时写入必须发生,以避免损坏读取的数据。因此,在写入锁定时不能读取锁定,反之亦然。在单个线程中,如果这两个访问器都试图获取数据而不释放它,则会再次发生死锁。与所有访问者的想法是使用它们在小块,所以他们不会“锁”的时间超过要求的锁。对于不需要同步的情况,Const(常量)只是一种优化(大家只是读取,而不是写入)。 – StoryTeller

相关问题