2015-06-30 15 views
10

मैं इस link से विभिन्न STL कंटेनरों की धागा सुरक्षा के बारे में पढ़ रहा हूँ अब मैं इस बात जिसके लिए सी ++ 11 केवलसी ++ 11/सी ++ 03 और std :: वेक्टर धागा सुरक्षा

राज्यों में आए

ही कंटेनर में विभिन्न तत्वों, अलग धागे से समवर्ती संशोधित किया जा सकता std::vector<bool> के तत्वों के अलावा (उदाहरण के लिए, std::future वस्तुओं की एक वेक्टर से अधिक थ्रेड से मूल्यों प्राप्त हो सकता है)

इसका मतलब यह है कि अगर मैं इस जैसे एक तरीका है जिसके कई द्वारा इस्तेमाल किया जा रहा है धागे एक साथ (notice the method does not have any locks)

void ChangeValue(int index , int value) 
{ 
    someVector[index] = value; 
} 

उपरोक्त विधि सुरक्षित है है। मेरी समझ यह है कि यह केवल सी ++ 11 के लिए सुरक्षित है। लेकिन जब मैं दूसरे बयान लिंक

सभी स्थिरांक सदस्य कार्यों ही कंटेनर पर विभिन्न धागे से समवर्ती कहा जा सकता है में उल्लेख को देखो। इसके अतिरिक्त, सदस्य प्रारंभ(), अंत(), rbegin(), rend(), front(), back(), डेटा(), ढूंढें(), निचला_बाउंड(), upper_bound(), equal_range (), सहयोगी कंटेनर, ऑपरेटर [] को छोड़कर, थ्रेड सुरक्षा के प्रयोजनों के लिए कॉन्स्ट के रूप में व्यवहार करते हैं (यानी, उन्हें एक ही कंटेनर पर विभिन्न धागे द्वारा समवर्ती रूप से भी कहा जा सकता है)। अधिक आम तौर पर, सी ++ मानक लाइब्रेरी फ़ंक्शंस ऑब्जेक्ट्स को संशोधित नहीं करते हैं जब तक कि उन ऑब्जेक्ट्स इस पॉइंटर सहित फ़ंक्शन के गैर-कॉन्स्ट तर्कों के माध्यम से, प्रत्यक्ष या परोक्ष रूप से पहुंच योग्य नहीं हैं।

मैं इस निष्कर्ष पर पहुंचा हूं कि सी ++ 03 में उपरोक्त विधि को सुरक्षित रूप से भी उपयोग किया जा सकता है। कृपया मेरी समझ सही है अगर मेरी समझ सही है।

+5

यह पूछना व्यर्थ है कि सी ++ 03 - सी ++ 03 के तहत कुछ थ्रेड-सुरक्षित है या पहले थ्रेड या थ्रेड सुरक्षा की कोई अवधारणा नहीं थी। –

+1

'चेंजवैल्यू' थ्रेड-सुरक्षित है (जैसा कि सी ++ 11 और बाद में परिभाषित किया गया है) जब तक कि कोई भी दो धागे 'इंडेक्स' के लिए समान तर्क पास नहीं करते हैं, या फिर एक ही तर्क को पार करने वाली कॉल एक दूसरे के साथ बाहरी रूप से सिंक्रनाइज़ होती हैं समारोह में। –

+0

उस इगोर को साफ़ करने के लिए धन्यवाद। क्या आप इसे एक उत्तर के रूप में डाल सकते हैं – MistyD

उत्तर

8

यह पूछना व्यर्थ है कि सी ++ 03 मानक - सी ++ 03 के तहत कुछ थ्रेड-सुरक्षित है या पहले थ्रेड या थ्रेड सुरक्षा की कोई अवधारणा नहीं थी।

ChangeValue डेटा दौड़ मुक्त (के रूप में द्वारा सी ++ 11 और बाद में परिभाषित) जब तक कोई दो धागे index के लिए एक ही तर्क पारित, वरना एक ही तर्क गुजर कॉल एक दूसरे के साथ सिंक्रनाइज़ किए जाते हैं कुछ बाहरी तरह से है समारोह में।

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