"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > गो का `sync.Once` `done` फ़्लैग सेट करने के लिए सामान्य असाइनमेंट के बजाय `atomic.StoreUint32` का उपयोग क्यों करता है?

गो का `sync.Once` `done` फ़्लैग सेट करने के लिए सामान्य असाइनमेंट के बजाय `atomic.StoreUint32` का उपयोग क्यों करता है?

2024-11-25 को प्रकाशित
ब्राउज़ करें:562

Why does Go\'s `sync.Once` use `atomic.StoreUint32` instead of normal assignment to set the `done` flag?

गो के सिंक में परमाणु संचालन का उचित उपयोग। एक बार

गो के सिंक के संदर्भ में। एक बार कार्यान्वयन, इसे समझना महत्वपूर्ण है किए गए फ़्लैग को सेट करते समय सामान्य असाइनमेंट और परमाणु.StoreUint32 ऑपरेशन के बीच अंतर।

गलत कार्यान्वयन

प्रारंभ में, एक बार.गो में Do फ़ंक्शन ने निम्नलिखित दृष्टिकोण का उपयोग किया:

if atomic.CompareAndSwapUint32(&o.done, 0, 1) {
    f()
}

यह कार्यान्वयन यह गारंटी देने में विफल रहता है कि Do की वापसी पर f का निष्पादन पूरा हो गया है। करने के लिए दो समवर्ती कॉलों के परिणामस्वरूप पहली कॉल सफलतापूर्वक f पर कॉल कर सकती है, जबकि दूसरी कॉल समय से पहले लौट आती है, यह मानते हुए कि f समाप्त हो गया है, भले ही ऐसा नहीं हुआ है।

परमाणु स्टोर संचालन

इस समस्या का समाधान करने के लिए, गो परमाणु.StoreUint32 ऑपरेशन का उपयोग करता है। सामान्य असाइनमेंट के विपरीत,atomic.StoreUint32 अन्य goroutines के लिए अद्यतन किए गए ध्वज की दृश्यता सुनिश्चित करता है।

मेमोरी मॉडल विचार

सिंक में परमाणु संचालन का उपयोग।एक बार है मुख्य रूप से अंतर्निहित मशीन के मेमोरी मॉडल से प्रभावित नहीं होता है। गो का मेमोरी मॉडल एक एकीकृत अमूर्त के रूप में कार्य करता है, जो विभिन्न हार्डवेयर प्लेटफार्मों पर लगातार व्यवहार सुनिश्चित करता है, चाहे उनके विशिष्ट मेमोरी मॉडल कुछ भी हों।

अनुकूलित तेज़ पथ

प्रदर्शन को अनुकूलित करने के लिए, सिंक करें .एक बार सामान्य परिदृश्यों के लिए एक तेज़ पथ का उपयोग किया जाता है जहां किया गया ध्वज पहले से ही सेट है। यह तेज़ पथ म्यूटेक्स प्राप्त किए बिना पूर्ण ध्वज की जांच करने के लिए परमाणु.LoadUint32 का उपयोग करता है। यदि ध्वज सेट है, तो फ़ंक्शन तुरंत वापस आ जाता है। धीमे पथ में प्रवेश किया गया है. यह सुनिश्चित करने के लिए एक म्यूटेक्स प्राप्त किया जाता है कि केवल एक कॉलर ही एफ निष्पादित करने के लिए आगे बढ़ सकता है। एफ पूरा होने के बाद, परमाणु.StoreUint32 का उपयोग पूर्ण ध्वज को सेट करने के लिए किया जाता है, जिससे यह अन्य गोरआउट्स के लिए दृश्यमान हो जाता है। परमाणु रूप से, यह समवर्ती पठन को सुरक्षित नहीं बनाता है। संरक्षित महत्वपूर्ण अनुभाग के बाहर ध्वज को पढ़ने के लिएatomic.LoadUint32 के उपयोग की आवश्यकता होती है। हालाँकि, पारस्परिक बहिष्करण प्रदान करने वाले म्यूटेक्स के कारण महत्वपूर्ण अनुभाग के भीतर सीधे पढ़ना सुरक्षित है। अंतर्निहित मेमोरी का उपयोग करें और डेटा दौड़ से बचें। परमाणु संचालन और म्यूटेक्स का संयोजन प्रदर्शन अनुकूलन और शुद्धता की गारंटी दोनों प्रदान करता है।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3