2017-07-24 15 views
8

Aşağıdaki kodda, a1'u serbest bırakmazsam, kod map.find işlevinin içinde sonsuz bir döngüde sıkışmış gibi görünüyor.Neden tbb hash haritasında aynı öğe için iki erişimci alamıyorum?

Uygulamanın iki farklı bölümünde bir öğe aramam gerekirse ne yapmalıyım?

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

cevap

8

Erişimci yazma erişimi verir. Bu, bir yazma kilidinin alındığı ve tek bir erişim sağlayıcıdan daha fazla tutulmadığı anlamına gelir. Bir kilitlenme girersiniz çünkü aynı iş parçacığı aynı öğeyi farklı erişim noktaları üzerinden yazmak için kilitlemeye çalışır. veri okumak için istediğin ise

ardından find ile const_accessor kullanın. Sadece bir okuma kilidi kazanacaktır. Kilitlenmeden çoklu okuma kilitleri elde edilebilir ve tutulabilir.

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

Çok teşekkür ederim! – Jack

+0

Bir şekilde aynı anda bir const_accessor ve bir accessor'a sahip olmak mümkün mü? – Jack

+1

@Jack - Hayır. Okuma yazmalarını bozmaktan kaçınmak için kimsenin okumadığı zamanlarda A Yazması gerekir. Bu yüzden, bir yazma kilidi varken, bunun yerine bir okuma kilidi alınamaz ve bunun tersi de geçerlidir. Tek bir iş parçacığında, her iki erişimci de verileri serbest bırakmadan veriyi almaya çalışırsa tekrar kilitleneceksiniz. Tüm erişimcilerle fikir, onları küçük bloklarda kullanmaktır, bu yüzden kilitlemeye gerekenden daha uzun süre "yapışmaz". Const olanlar sadece senkronizasyonun gerekli olmadığı durum için bir optimizasyon (herkes okur, yazmaz). – StoryTeller

İlgili konular