2010-01-31 12 views
13

Suppoes मेरे पास है:std :: map पर थ्रेड-सुरक्षित क्या ऑपरेशन हैं?

stl::map<std::string, Foo> myMap; 

निम्नलिखित समारोह धागा सुरक्षित है?

myMap["xyz"] ? 

आईई। मैं इस विशाल पढ़ने-योग्य मानचित्र को रखना चाहता हूं जो कई धागे के बीच साझा किया जाता है; लेकिन मुझे नहीं पता कि यह खोजना भी धागा सुरक्षित है।

धन्यवाद!

संपादित करें:

सबकुछ पहले एक बार लिखा जाता है।

उसके बाद, इसके बाद से कई धागे पढ़ते हैं।

मैं इसे यथासंभव विस्फोट के रूप में बनाने के लिए ताले से बचने की कोशिश कर रहा हूं। (Yaya संभव समय से पहले अनुकूलन मुझे पता है)

उत्तर

11

सिद्धांत में कोई एसटीएल कंटेनर थ्रेडसेफ नहीं हैं। अभ्यास में पढ़ना सुरक्षित है यदि कंटेनर को समवर्ती रूप से संशोधित नहीं किया जा रहा है। यानी मानक धागे के बारे में कोई विनिर्देश नहीं बनाता है। मानक इच्छा और द्वितीय यूसीसी का अगला संस्करण तब सुरक्षित रीडोनली व्यवहार की गारंटी देगा।

यदि आप वास्तव में चिंतित हैं, तो बाइनरी खोज के साथ एक क्रमबद्ध सरणी का उपयोग करें।

2

एसटीएल संग्रह threadsafe नहीं हैं, लेकिन यह एक करने के लिए धागा सुरक्षा जोड़ने के लिए काफी सरल है।

आपकी सर्वश्रेष्ठ शर्त प्रश्न में संग्रह के आसपास एक थ्रेडसेफ रैपर बना रही है।

6

कम से कम माइक्रोसॉफ्ट के कार्यान्वयन में, कंटेनर से पढ़ने धागा सुरक्षित (reference) है।

हालांकि, std::map::operator[] डेटा संशोधित कर सकते हैं और const घोषित नहीं किया गया है। const_iterator प्राप्त करने के लिए आपको std::map::find का उपयोग करना चाहिए, जो const है और इसे अस्वीकार करें।

+0

, इसे लिखने की आवश्यकता है। इसलिए धागा सुरक्षा चिंता ... –

+1

प्रश्न बताते हैं कि हम केवल पढ़ने के लिए मानचित्र देख रहे हैं।मुझे लगता है कि इसका मतलब यह है कि यह कई धागे से पढ़ने से पहले पूरी तरह से एक धागे में भर जाता है। –

4

सैद्धांतिक रूप से, केवल-पढ़ने के लिए डेटा संरचनाओं और कार्यों को थ्रेड-सुरक्षा के लिए किसी भी ताले की आवश्यकता नहीं होती है। यह स्वाभाविक रूप से थ्रेड-सुरक्षित है। समवर्ती स्मृति पढ़ने पर कोई डेटा दौड़ नहीं है। हालांकि, आपको केवल एक ही थ्रेड द्वारा सुरक्षित प्रारंभिकरण की गारंटी देनी होगी।

मैक्स एस के रूप में, ज्यादातर myMap["xyz"] तरह मानचित्र में एक तत्व को पढ़ने नहीं लिखने के संचालन के लिए होता है के कार्यान्वयन बताया। यदि ऐसा है, तो यह सुरक्षित है। लेकिन, एक बार फिर, आपको गारंटी देनी चाहिए कि कोई धागा नहीं है जो प्रारंभिक चरण को छोड़कर संरचना को संशोधित करता है।

7

सी ++ 11 आवश्यक है कि सभी सदस्य कार्यों const के रूप में घोषित धागा सुरक्षित कई पाठकों के लिए कर रहे हैं।

कॉलिंग myMap["xyz"] थ्रेड-सुरक्षित नहीं है, क्योंकि std::map::operator[] को const के रूप में घोषित नहीं किया गया है। कॉलिंग myMap.at("xyz") थ्रेड-सुरक्षित है, हालांकि std::map::at को const के रूप में घोषित किया गया है। एक कंटेनर में कुछ भी होने के लिए

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