स्थिति चर होना चाहिए notify()
और unlock_sleep()
के संबंध में एक भी आदेश दिया है। मनमाने ढंग से lockables साथ इस लक्ष्य को पूरा std::condition_variable_any
कार्यान्वयन आम तौर पर आंतरिक रूप से एक और म्युटेक्स का उपयोग करें (atomicity सुनिश्चित करने के लिए और पर सोने के लिए)libC++ एसटीडी के कार्यान्वयन :: condition_variable_any
तो आंतरिक unlock_sleep()
और notify()
(notify_one()
या notify_all()
) के संचालन के लिए एक दूसरे आप एक धागा जोखिम के संबंध में परमाणु नहीं हैं म्यूटेक्स को अनलॉक करना, एक और थ्रेड सिग्नलिंग और फिर मूल धागा सोना और कभी जागना नहीं।
मैं libstdC++ और libC++ std :: condition_variable_any के कार्यान्वयन को पढ़ने और पाया है this code in the libc++ implementation
{lock_guard<mutex> __lx(*__mut_);}
__cv_.notify_one();
आंतरिक म्युटेक्स लॉक किया गया है और फिर तुरंत संकेत ऑपरेशन से पहले अनलॉक कर दिया गया था। क्या यह ऊपर वर्णित समस्या का जोखिम नहीं उठाता है?
libstdc++ seems to have gotten this right
मैं 'unlock_sleep()' से अपरिचित हूं। क्या आप दस्तावेज़ों के लिए एक लिंक प्रदान कर सकते हैं? साथ ही, 'सूचित करें() 'क्या आपका मतलब' notify_one() 'या' notify_all() 'है? –
@ माइकलबुरर क्षमा करें मेरा मतलब है कि सोने पर जाने और म्यूटेक्स को एक परमाणु ऑपरेशन के रूप में अनलॉक करने का सामान्य संचालन था। मैं – Curious