WaitGroup.Wait() और Memory Barriers
एक बहु-थ्रेडेड वातावरण में जहां साझा चर तक पहुंच होती है, सिंक्रनाइज़ेशन को लागू करना आवश्यक है अप्रत्याशित परिणामों को रोकने के लिए. गो में ऐसा एक तंत्र "सिंक.वेटग्रुप" पैकेज है, जो समवर्ती रूप से चलने वाले गोरआउट्स के प्रबंधन की सुविधा प्रदान करता है। विशिष्ट कोड स्निपेट. इस स्निपेट में, वस्तुओं के एक सेट के लिए एक विशिष्ट स्थिति की जांच करने के लिए कई गोरोइन लॉन्च किए जाते हैं। सभी गोरोइन पूरा होने के बाद, "WaitGroup.Wait()" फ़ंक्शन को कॉलिंग गोरोइन को ब्लॉक करने के लिए लागू किया जाता है जब तक कि प्रतीक्षा संख्या शून्य तक नहीं पहुंच जाती।
सवाल उठता है: क्या साझा चर की स्थिति की जांच करना सुरक्षित है "WaitGroup.Wait()" के बाद "हालत" वापस आती है?
मेमोरी बाधाएं विच्छेदितएक मेमोरी बैरियर एक हार्डवेयर निर्देश है जो विभिन्न थ्रेड्स में मेमोरी एक्सेस के एक विशिष्ट क्रम को लागू करता है। यह सुनिश्चित करता है कि बैरियर से पहले किए गए मेमोरी राइट्स के प्रभाव बैरियर के बाद किए गए बाद के मेमोरी रीड्स पर दिखाई देते हैं।
गो भाषा में, मेमोरी बैरियर प्रोग्रामर के सामने स्पष्ट रूप से उजागर नहीं होते हैं। इसके बजाय, "WaitGroup" और "sync.Mutex" जैसे सिंक्रोनाइज़ेशन प्रिमिटिव आवश्यक होने पर मेमोरी बाधाओं को स्पष्ट रूप से लागू करते हैं। "WaitGroup.Wait()" के दस्तावेज़ में कहा गया है कि यह तब तक ब्लॉक रहता है जब तक कि प्रतीक्षा संख्या शून्य तक नहीं पहुंच जाती, स्पष्ट रूप से घटित होने से पहले स्थापित किए बिना संबंध। हालाँकि, आंतरिक कार्यान्वयन विवरण से पता चलता है कि "WaitGroup.Wait()" वास्तव में घटित होने से पहले वाला संबंध स्थापित करता है। इस संबंध का मतलब है कि "WaitGroup.Wait()" से पहले किए गए सभी मेमोरी राइट्स "WaitGroup.Wait()" के बाद किए गए मेमोरी रीड्स के दृश्यमान होने की गारंटी है।
कंडीशन चेक की सुरक्षा"WaitGroup.Wait()" द्वारा स्थापित घटित-पूर्व संबंध के आधार पर, बाद में साझा किए गए चर "स्थिति" की स्थिति की जांच करना सुरक्षित है "WaitGroup.Wait()" लौटता है। यह गारंटी सुनिश्चित करती है कि सभी गोरूटाइन ने अपना निष्पादन पूरा कर लिया है, यह सुनिश्चित करते हुए कि "स्थिति" का मान कम से कम एक गोरोइन द्वारा संशोधित किया गया है यदि शर्त किसी भी आइटम के लिए पूरी की गई थी।
रेस कंडीशन कैविएटयह ध्यान रखना महत्वपूर्ण है कि "WaitGroup.Wait()" के बाद "स्थिति" की जांच करने की सुरक्षा केवल तभी मान्य होती है जब संसाधित होने वाली वस्तुओं की संख्या होती है एक से अधिक. यदि वस्तुओं की संख्या एक है, तो एक दौड़ की स्थिति उत्पन्न हो सकती है, जहां "WaitGroup.Wait()" को कॉल करने से पहले कोई भी गोरोइन "स्थिति" को संशोधित नहीं करता है। इसलिए, यह सलाह दी जाती है कि इस परिदृश्य से बचने के लिए यह सुनिश्चित करें कि वस्तुओं की संख्या हमेशा एक से अधिक हो।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3