"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > क्या मुझे `condition_variable.notify_one()` पर कॉल करने से पहले लॉक प्राप्त करना चाहिए?

क्या मुझे `condition_variable.notify_one()` पर कॉल करने से पहले लॉक प्राप्त करना चाहिए?

2024-12-23 को प्रकाशित
ब्राउज़ करें:125

Should I Acquire a Lock Before Calling `condition_variable.notify_one()`?

condition_variable.notify_one() को कॉल करने से पहले लॉक कब प्राप्त किया जाना चाहिए?

मल्टीथ्रेडेड प्रोग्रामिंग में,condition_variables का उपयोग वेटिंग थ्रेड्स को सिग्नल करने के लिए किया जाता है एक विशिष्ट शर्त पूरी हो गई है. हालाँकि कंडीशन_वेरिएबल.वेट() को कॉल करने से पहले लॉक रखना आवश्यक है, लेकिन इस बारे में कुछ अनिश्चितता है कि क्या notify_one() को कॉल करने से पहले लॉक की भी आवश्यकता है।

क्या मैं notify_one से पहले म्यूटेक्स को लॉक कर सकता हूँ( ) और क्यों?

notify_one() से पहले म्यूटेक्स को लॉक करना अनिवार्य नहीं है, लेकिन यह कुछ परिदृश्यों में फायदेमंद हो सकता है। जब सूचित करने वाला थ्रेड notify_one() को कॉल करने से पहले लॉक जारी करता है, तो यह प्रतीक्षा थ्रेड को तुरंत निष्पादित करना शुरू करने की अनुमति देता है। हालाँकि, यदि सूचित करने वाला थ्रेड लॉक रखता है, तो आगे बढ़ने से पहले प्रतीक्षारत थ्रेड को इसके रिलीज़ होने का इंतजार करना होगा।

inform_one()

प्रदान किए गए उदाहरण में, लॉक को notify_one() के बाद के कॉल के लिए अधिग्रहित किया गया है क्योंकि i वेरिएबल को प्रारंभिक notify_one() के बाद महत्वपूर्ण अनुभाग के भीतर संशोधित किया जा रहा है। यह सुनिश्चित करता है कि निष्पादन फिर से शुरू करते समय प्रतीक्षा थ्रेड i के अद्यतन मूल्य का पालन करता है। notify_one() कॉल से दौड़ की स्थिति पैदा हो सकती है जहां उपभोक्ता थ्रेड समय से पहले निष्पादन शुरू कर देता है और अधिसूचना चूक जाता है। हालाँकि, यह कोई वैध चिंता नहीं है।

सी मानक के अनुसार,condition_variable::wait() एक आंतरिक लूप की तरह व्यवहार करता है जो लगातार एक विधेय की जाँच करता है और यदि आवश्यक हो तो प्रतीक्षा करता है। इस मामले में, विधेय है [] {वापसी i == 1; }. यदि उपभोक्ता थ्रेड की जांच करने पर i 1 के बराबर नहीं है, तो आंतरिक लूप आसानी से समाप्त हो जाएगा, जिससे थ्रेड को निष्पादन फिर से शुरू करने से रोका जा सकेगा।इसलिए, भले ही निर्माता थ्रेड उपभोक्ता थ्रेड की जांच से पहले notify_one() को कॉल करता हो मैं, उपभोक्ता थ्रेड अधिसूचना को मिस नहीं करेगा।

निष्कर्ष

हालांकि सख्ती से आवश्यक नहीं है, लॉक करना condition_variable.notify_one() को कॉल करने से पहले म्यूटेक्स विशिष्ट परिदृश्यों में फायदेमंद हो सकता है। यह प्रतीक्षा थ्रेड को तुरंत निष्पादन फिर से शुरू करने की अनुमति देता है और यह सुनिश्चित करता है कि प्रतीक्षा थ्रेड साझा किए गए डेटा की अद्यतन स्थिति का निरीक्षण करता है (इस मामले में, i का मान)। प्रभावी मल्टीथ्रेडेड प्रोग्रामिंग के लिए कंडीशन_वेरिएबल्स के व्यवहार को समझना और लॉक का उपयोग करके थ्रेड्स को ठीक से सिंक्रोनाइज़ करना महत्वपूर्ण है।

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

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

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

Copyright© 2022 湘ICP备2022001581号-3