वर्तमान में, मैं C++ 11 में std::thread
का उपयोग करके एक बहु-थ्रेड प्रोजेक्ट को कार्यान्वित कर रहा हूं। मैं धागे सिंक्रनाइज़ करने के लिए std::condition_variable
का उपयोग करता हूं। विस्तार से, एक उपभोक्ता फ़ंक्शन std::condition_variable
के सदस्य फ़ंक्शन को वैश्विक कार्य कतार से कार्य की प्रतीक्षा करने के लिए कॉल करता है, एक अन्य निर्माता फ़ंक्शन उत्पन्न करता है और कार्यों को कतार में रखता है। लेकिन मुझे notify_all()
और notify_one()
std::condition_variable
के सदस्य कार्यों के बीच का अंतर नहीं पता है। निर्माता फ़ंक्शन में मुझे किस फ़ंक्शन का उपयोग करना चाहिए? धन्यवाद!std :: condition_variable के notify_all() और notify_one() के बीच क्या अंतर है?
26
A
उत्तर
22
यदि स्थिति चर पर दस धागे अवरुद्ध हैं, उदाहरण के लिए, notify_one()
केवल एक थ्रेड को अनब्लॉक करेगा, जबकि notify_all()
उन सभी को अनवरोधित कर देगा। आपके मामले में, आप notify_one()
का उपयोग करना चाहेंगे ताकि आप उन धागे को जगा न सकें जिनके पास कोई काम नहीं है।
संबंधित मुद्दे
- 1. std :: condition_variable और std :: condition_variable_any के बीच क्या अंतर है?
- 2. std :: merge और std :: set_union के बीच क्या अंतर है?
- 3. "यूटीएफ -16" और "std :: wstring" के बीच क्या अंतर है?
- 4. std :: quick_exit और std :: abort के बीच क्या अंतर है और std :: quick_exit क्यों आवश्यक था?
- 5. std :: is_integer और std :: is_integral के बीच अंतर?
- 6. std :: move और unique_ptr :: रीसेट के बीच अंतर क्या हैं?
- 7. std :: string :: c_str और std :: string :: डेटा के बीच क्या अंतर है?
- 8. क्या std :: set :: iterator और std :: set :: const_iterator के बीच कोई परिचालन अंतर है?
- 9. पैरामीटर परिभाषाओं के बीच अंतर (प्रकार और नाम), और (प्रकार * नाम) के बीच अंतर क्या हैं?
- 10. # {} $ {} और% {} के बीच क्या अंतर है?
- 11. [अपरिभाषित] और [,] के बीच क्या अंतर है?
- 12. $ और $$ के बीच क्या अंतर है?
- 13. के बीच क्या अंतर है:। और: आर !?
- 14. भिन्नता और '-' के बीच क्या अंतर है?
- 15. "$^एन" और "$ +" के बीच क्या अंतर है?
- 16. के बीच क्या अंतर है?
- 17. स्ट्रिंग :: एट और स्ट्रिंग :: ऑपरेटर [] के बीच क्या अंतर है?
- 18. std :: इंडेक्स और डालने के बीच मानचित्र अंतर
- 19. क्या आप std :: condition_variable के साथ std :: recursive_mutex को जोड़ सकते हैं?
- 20. आकार और संरेखण के बीच क्या अंतर है?
- 21. -std = C++ 11 और -std = gnu ++ 11 के बीच अंतर क्या हैं?
- 22. अंतर और कहां के बीच क्या अंतर है?
- 23. Cstdlib और stdlib.h के बीच क्या अंतर है?
- 24. अभ्यास में std :: sort और std :: stable_sort के बीच प्रदर्शन अंतर कितना बड़ा है?
- 25. std, tr1 और boost (नामस्थान और/या पुस्तकालयों के रूप में) के बीच अंतर क्या हैं?
- 26. "। +" और "। +?" के बीच अंतर
- 27. "कंटेनर" और "डेटा संरचना" के बीच क्या अंतर है?
- 28. ++ iterator और iterator ++ के बीच प्रदर्शन अंतर?
- 29. अपवाद के .TOString() और मैसेज के बीच क्या अंतर है?
- 30. 7zip के 7z.sfx और 7zsd.sfx के बीच क्या अंतर है?
धन्यवाद, जीएमएन। मैंने इंटरनेट से कुछ दस्तावेज पढ़े। जैसा आपने कहा था। हालांकि, आमतौर पर प्रतीक्षा() फ़ंक्शन का उपयोग म्यूटेक्स पर किया जाता है, उदा। std :: unique_lock उल (m_mutexTask); जबकि (m_lTask.empty()) {m_condTask.wait (उल); }। फिर भी notify_all() सभी धागे को जगाते हैं, केवल एक धागा म्यूटेक्स को लॉक कर सकता है, है ना? –
केवल एक थ्रेड म्यूटेक्स को एक समय में लॉक कर देगा, लेकिन जैसे ही वे म्यूटेक्स प्राप्त करेंगे, वे सभी 'प्रतीक्षा' से वापस आ जाएंगे। –
@Yun: उपयोग करने के लिए कौन सा एक वास्तव में इस बात पर निर्भर करता है कि प्रतीक्षा प्रतीक्षा धागे उस चीज़ को संभाल सकते हैं जिसके लिए इंतजार किया जा रहा है। यदि कोई ऐसा करेगा (उदा।, कतार पर एकाधिक समान पाठक) तो आप notify_one का उपयोग करते हैं क्योंकि यह निश्चित रूप से अधिक कुशल है। यदि वहां एक और जटिल स्थिति है जैसे कि केवल एक प्रतीक्षा धागा वास्तव में लूप की स्थिति के साथ सफल हो सकता है, तो आपको उन सभी को जागृत करना होगा क्योंकि आप नियंत्रित नहीं कर सकते कि कौन सा धागा notify_one द्वारा जागृत किया जाएगा। –