यह काफी के रूप में सरल नहीं के रूप में यह दो मामलों को छोड़कर, लग सकता है है: सिंक्रनाइज़ करने के लिए, कभी जरूरत नहीं
- जब केवल पाठकों और कोई लेखकों देखते हैं, तो आप करते हैं।
- जब कई धागे लिखते हैं और उनमें से कम से कम एक पढ़ना-संशोधित-लेखन ऑपरेशन (जैसे
++x;
) कर रहा है तो आप हमेशा सिंक्रनाइज़ करने की आवश्यकता है, या आपको पूरी तरह से अप्रत्याशित परिणाम मिलेंगे।
अन्य सभी मामलों में, यदि आप कम से कम एक लेखक और एक पाठक (या कई लेखकों) है, तो आप आमतौर पर (बहुत कुछ अपवादों को छोड़कर) का उपयोग सिंक्रनाइज़ करने के लिए की जरूरत है, लेकिन जरूरी नहीं कि हमेशा की तरह, और हमेशा सख्त संभव तरीके से नहीं।
यह बहुत अधिक निर्भर करता है कि आपको किस गारंटी की आवश्यकता है। कुछ अनुप्रयोगों को धागे पर सख्त अनुक्रमिक स्थिरता की आवश्यकता होती है (और कभी-कभी आपको लॉक निष्पक्षता की भी आवश्यकता होती है)। कुछ अनुप्रयोग समान रूप से अच्छी तरह से काम करेंगे, लेकिन बहुत बेहतर प्रदर्शन के साथ, यदि वे केवल एक ही थ्रेड के भीतर गारंटी से पहले होते हैं। फिर भी अन्य अनुप्रयोगों को भी इतना जरूरत नहीं है और वे आराम से संचालन या पूरी तरह से गारंटी के बिना पूरी तरह से खुश हैं।
// worker thread
running = true;
while(running) { task = pull_task(); execute(task); }
// main thread exit code
running = false;
join(workerthread);
यह किसी भी तुल्यकालन के बिना पूरी तरह से अच्छी तरह से काम करता है:
उदाहरण के लिए, इस "विशिष्ट" एक कार्यकर्ता धागा के कार्यान्वयन एक लेखक और एक पाठक है। हां, पैडेंटिकली बोलना यह अनिर्धारित है कि running
का मूल्य कब बदल जाएगा, लेकिन वास्तव में इससे कोई फर्क नहीं पड़ता। स्मृति स्थान में कुछ "यादृच्छिक" मध्यवर्ती मूल्य नहीं हो सकता है, और इससे कोई फर्क नहीं पड़ता कि परिवर्तन पहले या बाद में कुछ दर्जन नैनोसेकंड दिखाई देता है क्योंकि कार्यकर्ता धागा किसी भी कार्य को निष्पादित करने में व्यस्त होगा, और सबसे बुरे मामले में यह कुछ मिलीसेकंड बाद में परिवर्तन को उठाता है। आखिरकार, अगले पुनरावृत्ति पर, कार्यकर्ता धागा परिवर्तन उठाएगा और बाहर निकल जाएगा।
कुछ साल पहले डॉ। डॉबब में प्रकाशित एसपीएससी फास्ट-फॉरवर्ड कतार एक समान सिद्धांत पर काम करती थी, केवल पॉइंटर्स के साथ।
कई अलग सिंक्रनाइज़ेशन मोडों पर उनके अच्छे और व्यापक पढ़ने और उनके प्रभाव GCC documentation में दिए गए हैं।
मामले 2 और 3, यानी कोई भी स्थिति जिसमें कम से कम एक धागा कम से कम एक अन्य थ्रेड पढ़ने या लिखने के साथ लिख रहा है। – juanchopanza
आपको विभिन्न धागे से डेटा तक पहुंचने पर हमेशा लॉक करने की आवश्यकता नहीं है। परमाणु परिचालनों को देखें, और विशेष रूप से सी ++ 11 के 'std :: atomic' – nijansen
पर और हां, अपने अंतिम वाक्य को संबोधित करने के लिए, मल्टीकोर सीपीयू पर कैश के विभिन्न स्तरों में प्रत्येक मान की कई प्रतियां हो सकती हैं। – Hulk