2012-10-30 6 views
9

यहाँ संपादित कर सकते हैं परिदृश्य है:सी ++ एसटीएल unordered_map, धागा सुरक्षा जहां प्रत्येक धागा केवल उसके अपने सौंपा कुंजी एक्सेस और कहा कि मूल्य

1) का उपयोग कर एक unordered_map<int, vector<MyClass*>*> की मैं चाबियाँ 1, 2 जोड़ते हैं, ... 8
2) सभी कुंजी प्रोग्राम प्रारंभिकरण में वेक्टर के साथ सेट की गई हैं और कुछ भी जोड़ा या हटाया गया है
3) मेरे पास 8 धागे हैं, जहां थ्रेड 1 कुंजी [1], थ्रेड 2 कुंजी [2], ... thread8 कुंजी का उपयोग करता है [8] (यानी थ्रेड नंबर केवल उस कुंजी नंबर तक पहुंच सकता है और कोई अन्य कुंजी नहीं)

कभी-कभी मैं मान vecto को फिर से असाइन करता हूं आर * एक और ढेर आवंटित संग्रह के लिए। (यानी थ्रेड 1 key[1] = new vector<MyClass*> करता है)

मेरा मानना ​​है कि यह थ्रेड सुरक्षित होगा, क्या मैं सही हूं? यदि नहीं, तो मुझे लगता है कि मैं concurrent_unordered_map का उपयोग करूंगा।

धन्यवाद।

+0

मुझे अभी पता चला है कि '[container.requirements.dataraces]/1' यह मेरे मूल उत्तर में सुझाए गए मुकाबले बहुत अच्छे तरीके से किया जा सकता है। कृपया देख लीजिये। – Mankarse

उत्तर

11

इस सवाल का जवाब [res.on.data.races]/3 में पाया जा सकता:

एक C++ मानक पुस्तकालय समारोह नहीं करेगा प्रत्यक्ष या परोक्ष रूप वर्तमान धागा अलावा अन्य सूत्र द्वारा सुलभ वस्तुओं को संशोधित (1.10) जब तक वस्तुओं सीधे पहुँचा रहे हैं या अप्रत्यक्ष रूप से फ़ंक्शन के गैर-कॉन्स्ट तर्कों के माध्यम से, इसमें शामिल हैं।

इसके अलावा, [container.requirements.dataraces]/1 कहता है:

डेटा दौड़ से परहेज ([res.on.data.races]) के प्रयोजनों के लिए, कार्यान्वयन निम्नलिखित कार्यों पर विचार करेगा const होने के लिए: begin, end, rbegin, rend, front, back, data , find, lower_bound, upper_bound, equal_range, at और, सहयोगी या अनियंत्रित को छोड़कर एसोसिएटिव कंटेनर, operator[]

के बाद से unordered_map::operator[] गैर स्थिरांक है, यह जब operator[] के लिए एक कॉल होता है एक कार्यान्वयन unordered_map को संशोधित करने के लिए कानूनी है। इसके बजाय आप unordered_map::find, जो स्पष्ट रूप से const के रूप में व्यवहार किया जाना आवश्यक है का उपयोग करना चाहिए, और इसलिए बदलाव नहीं करेगी unordered_map:।

map.find(key)->second = new vector<MyClass*>; 

(एक तरफ ध्यान दें के रूप में, आपके द्वारा सुझाए गए डिजाइन मेमोरी लीक के लिए एक नुस्खा की तरह लग रहा क्यों नहीं इसे unordered_map<int, std::unique_ptr<vector<MyClass*>>>, या unordered_map<int,vector<MyClass*>> बनें?)

+1

मैं दूसरे विकल्प के लिए वोट दूंगा (कोई बिंदु सामान्य रूप से ढेर पर वेक्टर डालने वाला नहीं)। –

+0

उत्तरों के लिए धन्यवाद। मैं एक concurrent_unordered_map का उपयोग करूंगा और वेक्टर को ढेर पर नहीं रखूंगा (सादगी के लिए, हालांकि मैं इसे कोड में संक्षेप में प्रबंधित कर रहा हूं)। – GreekFire

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