2017-09-04 18 views
15

मैं रेस स्थितियों को रोकने के लिए मल्टीथ्रेडिंग, सी ++, उचित सिंक्रनाइज़ेशन और ताले पर विभिन्न चीजें पढ़ रहा हूं। मेरे लिए एक प्रश्न का उत्तर नहीं दिया गया है, हालांकि: क्या कोई म्यूटेक्स आवश्यक है यदि मैं थ्रेड ए में ऑब्जेक्ट बनाता हूं, लेकिन इसे बाद में थ्रेड बी में विशेष रूप से उपयोग करता हूं?थ्रेड ए में ऑब्जेक्ट बनाएं, थ्रेड बी Mutex में उपयोग करें?

दूसरे शब्दों में, मुझे पता है कि मुझे दौड़ की स्थिति को रोकने के लिए एक म्यूटेक्स की आवश्यकता नहीं है - क्या मुझे मेमोरी बाधा (या अन्य संभावित समस्याओं) के रूप में सेवा करने के लिए एक म्यूटेक्स चाहिए?

एक बहुत ही बुनियादी उदाहरण कल्पना करने के लिए मैं

struct Object { 
    void do_stuff(); 
}; 

Object o; 
std::thread worker_thread([&o](){ 
    while (alive) 
     o.do_stuff(); 
}).join(); 
// `o` is never used outside worker_thread 

मैं खुश हो सकता है अगर आप भी मुझे लेख की सिफारिश कर सकता है/किताबें, जहां मैं इस विषय और/या सही कीवर्ड्स में और अधिक पढ़ सकते हैं के लिए खोज करने के लिए मतलब है कि इस तरह के परिदृश्य।

+3

यदि केवल एक धागा वस्तु का उपयोग कर रहा है, * और आप उस पर भरोसा कर सकते हैं, तो आपको कोई समस्या नहीं होनी चाहिए। – Basya

उत्तर

18

यह ठीक है, आपको mutex की आवश्यकता नहीं है।

थ्रेड बनाना एक मेमोरी बाधा सेट करता है, इसलिए पर दिए गए संदर्भ के माध्यम से o तक पहुंच सुरक्षित है।

§ 30.3.2.2-6 - [thread.thread.constr]

निर्माता के आह्वान के पूरा होने च की प्रति के आह्वान की शुरुआत के साथ सिंक्रनाइज़ करता है।

worker_thread चल रहा हो, स्पष्ट रूप से आप धागा है कि यह बनाया में o का उपयोग नहीं कर सकता है (जैसा कि आपने कहा था)।

थ्रेड में शामिल होने से बाधा भी सेट हो जाती है, इसलिए worker_thread के बाद, आप अपने मुख्य थ्रेड में o तक पहुंच सकते हैं।

§ 30.3.2.5-4 - [thread.thread.destr]

धागा द्वारा * इस के साथ (1.10) इसी सफल में शामिल होने के() वापसी सिंक्रनाइज़ करता है का प्रतिनिधित्व के पूरा।

आगे पढ़ने के लिए:

  • एंथनी विलियम्स समानांतर प्रोग्रामिंग पर एक अच्छी पुस्तक लिखी (सी ++ कार्रवाई में संगामिति)
  • Bjarne Stroustrup की पुस्तक (सी ++ प्रोग्रामिंग भाषा, 4 संस्करण) समवर्ती प्रोग्रामिंग पर दो अच्छे अध्याय हैं।
  • जेफ प्रेसिंग इन विषयों में से कई के बारे में एक अच्छा ब्लॉग है; preshing.com
+1

बिल्कुल सही, बहुत बहुत धन्यवाद। मैं वास्तव में कार्रवाई में सी ++ समवर्ती पढ़ रहा था लेकिन इन जानकारी को नहीं मिला। लेकिन मुझे लगता है कि ऐसा इसलिए है क्योंकि मैंने अपने सिर – user823255

+1

स्वागत में थ्रेड सृजन और मेमोरी बाधा के बीच कनेक्शन नहीं बनाया है .. आम तौर पर आम संप्रदाय को ढूंढना चुनौतीपूर्ण होता है क्योंकि ये अलग-अलग अध्यायों में आमतौर पर अलग-अलग विषय होते हैं – LWimsey

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