यदि आप कोडपथ में म्यूटेक्स को लॉक नहीं करते हैं जो स्थिति और संकेतों को बदलता है, तो आप वेकअप खो सकते हैं। प्रक्रियाओं की इस जोड़ी पर विचार करें:
प्रक्रिया A:
pthread_mutex_lock(&mutex);
while (condition == FALSE)
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
प्रक्रिया बी (गलत):
condition = TRUE;
pthread_cond_signal(&cond);
फिर निर्देशों के इस संभावित इंटरलेविंग पर विचार करें, जहां condition
शुरू होता है FALSE
:
Process A Process B
pthread_mutex_lock(&mutex);
while (condition == FALSE)
condition = TRUE;
pthread_cond_signal(&cond);
pthread_cond_wait(&cond, &mutex);
condition
अब है TRUE
, लेकिन प्रक्रिया एक शर्त चर पर अटक प्रतीक्षा है - यह Wakeup संकेत याद किया। यदि हम म्यूटेक्स को लॉक करने के लिए प्रोसेस बी को बदलते हैं:
प्रक्रिया बी (सही):
pthread_mutex_lock(&mutex);
condition = TRUE;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
... तो ऊपर नहीं हो सकता; वेकअप कभी नहीं छूटेगा।
(ध्यान दें कि आप वास्तव में खुद को स्थानांतरित कर सकते हैं , लेकिन इसके परिणामस्वरूप थ्रेड्स का कम इष्टतम निर्धारण हो सकता है, और आपने आवश्यक रूप से स्थिति बदलने के कारण इस कोड पथ में पहले से ही म्यूटेक्स को लॉक कर दिया है)।pthread_cond_signal()
pthread_mutex_unlock()
pthread_signal_cond()
जा सकता है, हालांकि यह शायद बेहतर नहीं है। यह कहना अधिक सही है कि जिस बिंदु पर आप कॉल कर रहे हैंpthread_signal_cond()
, उस स्थिति को संशोधित करने के लिए आपको पहले से ही म्यूटेक्स को लॉक करना होगा।