2017-07-24 6 views
8

नीचे दिए गए कोड में, यदि मैं 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; 
} 

उत्तर

8

एक्सेसर लेखन पहुँच अनुमति देता है। इसका मतलब है कि एक लिखने का ताला अधिग्रहण किया जाता है, और एक भी एक्सेसर से अधिक नहीं होता है। आप एक डेडलॉक दर्ज करते हैं क्योंकि एक ही थ्रेड अलग-अलग एक्सेसर्स के माध्यम से लिखने के लिए एक ही तत्व को लॉक करने का प्रयास करता है।

यदि आप केवल इतना चाहते है डेटा को पढ़ने के लिए है, तो find के साथ एक const_accessor का उपयोग करें। यह केवल एक पठन लॉक प्राप्त होगा। एकाधिक पठन ताले हासिल किए जा सकते हैं और बिना डेडलॉकिंग के आयोजित किए जा सकते हैं।

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

आपको बहुत बहुत धन्यवाद! – Jack

+0

क्या किसी भी समय एक const_accessor और एक एक्सेसर एक ही समय में संभव है? – Jack

+1

@ जैक - नहीं। कोई लिखें तब नहीं होना चाहिए जब कोई भी पढ़ न सके, ताकि उनके पढ़ने वाले डेटा को दूषित करने से बचें। इसलिए लिखने के लॉक के दौरान कोई रीड लॉक हासिल नहीं किया जा सकता है, और इसके विपरीत। एक ही धागे में आप फिर से डेडलॉक करेंगे यदि दोनों एक्सेसर्स इसे जारी किए बिना डेटा हासिल करने का प्रयास करते हैं। सभी एक्सेसर्स के साथ विचार उन्हें छोटे ब्लॉक में उपयोग करना है, इसलिए वे आवश्यकतानुसार लंबे समय तक लॉक पर "चिपकते" नहीं हैं। कॉन्स्ट वाले लोग उस मामले के लिए एक अनुकूलन हैं जहां सिंक्रनाइज़ेशन की आवश्यकता नहीं है (हर कोई बस पढ़ता है, और लिखता नहीं है)। – StoryTeller

संबंधित मुद्दे

 संबंधित मुद्दे