सी ++ 11 मानक गारंटी देता है कि const
कंटेनरों तक विधि पहुंच अलग-अलग धागे से सुरक्षित है (यानी, दोनों const
विधियों का उपयोग करें)।
इसके अलावा, [container.requirements.dataraces] राज्यों
कार्यान्वयन जब उसी क्रम में विभिन्न तत्वों में निहित वस्तु, की सामग्री को vector<bool>
छोड़कर डेटा दौड़ से बचने के लिए आवश्यक हैं
दूसरे शब्दों में, vector<bool>
को छोड़कर अलग-अलग सामग्री को संशोधित करना डेटा रेस नहीं है।
अब, यदि एक थ्रेड किसी अन्य थ्रेड द्वारा उपयोग किए गए इटरेटर को अमान्य करता है, तो स्पष्ट रूप से यह एक डेटा रेस (और अपरिभाषित व्यवहार में परिणाम) है। यदि एक थ्रेड गैर-const
कंटेनर तक पहुंच करता है, और दूसरा const
एक्सेस करता है, तो यह एक डेटा रेस (और अपरिभाषित व्यवहार) है। (नोट: मल्टीथ्रेडिंग के उद्देश्य के लिए कई कार्यों को "const
" माना जाता है, जिसमें begin
, end
और अन्य फ़ंक्शंस (और विधियां) हैं जो गैर-const
हैं क्योंकि वे गैर-const
इटरेटर्स लौटते हैं। []
इस सेट में शामिल है छद्म सुरक्षा कारणों के लिए छद्म- const
, map
और unordered_set
आदि को छोड़कर - 23.2.2।1)।
हालांकि, ऐसा प्रतीत होता है कि यदि आपके पास कंटेनर के भीतर किसी तत्व का संदर्भ है, और उन परिचालनों में संलग्न है जो उस संदर्भ को किसी अन्य थ्रेड में अमान्य नहीं करते हैं, और उस तत्व को किसी अन्य थ्रेड में कभी नहीं लिखते हैं, तो आप सुरक्षित रूप से पढ़ सकते हैं वह संदर्भ। इसी प्रकार, यदि अन्य धागे तत्व से कभी भी नहीं पढ़ते हैं, तो उस तत्व को लिखना अनिश्चित व्यवहार में नहीं होना चाहिए।
मानकों के संदर्भ के लिए, 17.6.5.9.5 कि मानक पुस्तकालय से कार्यों दूर नहीं चलेगा की गारंटी और पढ़ने/तत्वों बेकार में लिखने के लिए लगता है।
तो संक्षिप्त उत्तर: आप सुरक्षित हैं, जब तक कि अन्य थ्रेड map
में उस विशेष प्रविष्टि से सीधे गड़बड़ नहीं करता है।
http://stackoverflow.com/questions/6438086/iterator-invalidation- नियम – inf
यह धागा सुरक्षित नहीं है, दो धागे से डालें और आप एक असंगत स्थिति में समाप्त हो सकते हैं। – paulm
@paulm, "_map कई धागे से बदला जा सकता है और इस का उपयोग कर सकते synchronized_ है" –