2017-07-24 80 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

相關問題