2012-01-26 11 views
26

वर्तमान में, मैं C++ 11 में std::thread का उपयोग करके एक बहु-थ्रेड प्रोजेक्ट को कार्यान्वित कर रहा हूं। मैं धागे सिंक्रनाइज़ करने के लिए std::condition_variable का उपयोग करता हूं। विस्तार से, एक उपभोक्ता फ़ंक्शन std::condition_variable के सदस्य फ़ंक्शन को वैश्विक कार्य कतार से कार्य की प्रतीक्षा करने के लिए कॉल करता है, एक अन्य निर्माता फ़ंक्शन उत्पन्न करता है और कार्यों को कतार में रखता है। लेकिन मुझे notify_all() और notify_one()std::condition_variable के सदस्य कार्यों के बीच का अंतर नहीं पता है। निर्माता फ़ंक्शन में मुझे किस फ़ंक्शन का उपयोग करना चाहिए? धन्यवाद!std :: condition_variable के notify_all() और notify_one() के बीच क्या अंतर है?

उत्तर

22

यदि स्थिति चर पर दस धागे अवरुद्ध हैं, उदाहरण के लिए, notify_one() केवल एक थ्रेड को अनब्लॉक करेगा, जबकि notify_all() उन सभी को अनवरोधित कर देगा। आपके मामले में, आप notify_one() का उपयोग करना चाहेंगे ताकि आप उन धागे को जगा न सकें जिनके पास कोई काम नहीं है।

+1

धन्यवाद, जीएमएन। मैंने इंटरनेट से कुछ दस्तावेज पढ़े। जैसा आपने कहा था। हालांकि, आमतौर पर प्रतीक्षा() फ़ंक्शन का उपयोग म्यूटेक्स पर किया जाता है, उदा। std :: unique_lock उल (m_mutexTask); जबकि (m_lTask.empty()) {m_condTask.wait (उल); }। फिर भी notify_all() सभी धागे को जगाते हैं, केवल एक धागा म्यूटेक्स को लॉक कर सकता है, है ना? –

+6

केवल एक थ्रेड म्यूटेक्स को एक समय में लॉक कर देगा, लेकिन जैसे ही वे म्यूटेक्स प्राप्त करेंगे, वे सभी 'प्रतीक्षा' से वापस आ जाएंगे। –

+13

@Yun: उपयोग करने के लिए कौन सा एक वास्तव में इस बात पर निर्भर करता है कि प्रतीक्षा प्रतीक्षा धागे उस चीज़ को संभाल सकते हैं जिसके लिए इंतजार किया जा रहा है। यदि कोई ऐसा करेगा (उदा।, कतार पर एकाधिक समान पाठक) तो आप notify_one का उपयोग करते हैं क्योंकि यह निश्चित रूप से अधिक कुशल है। यदि वहां एक और जटिल स्थिति है जैसे कि केवल एक प्रतीक्षा धागा वास्तव में लूप की स्थिति के साथ सफल हो सकता है, तो आपको उन सभी को जागृत करना होगा क्योंकि आप नियंत्रित नहीं कर सकते कि कौन सा धागा notify_one द्वारा जागृत किया जाएगा। –

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