यह सिर्फ तरीका है कि हालत चर रहे हैं (या मूल रूप से) लागू किया गया।
म्यूटेक्स का उपयोग कंडीशन चर की सुरक्षा के लिए किया जाता है । इसलिए आपको प्रतीक्षा करने से पहले इसे बंद करने की आवश्यकता है।
प्रतीक्षा "atomically" म्यूटेक्स को अनलॉक करेगी, दूसरों को स्थिति चर (सिग्नलिंग के लिए) तक पहुंचने की अनुमति देगा। फिर जब स्थिति चर का संकेत दिया जाता है या प्रसारण किया जाता है, तो प्रतीक्षा सूची में एक या अधिक थ्रेड्स जागृत हो जाएंगे और म्यूटेक्स को उस धागे के लिए फिर से जादुई रूप से बंद कर दिया जाएगा।
आप आमतौर पर निम्न स्थिति को चर के साथ देखते हैं, यह दर्शाता है कि वे कैसे काम करते हैं। निम्नलिखित उदाहरण एक श्रमिक धागा है जिसे एक स्थिति चर के संकेत के माध्यम से काम दिया जाता है।
thread:
initialise.
lock mutex.
while thread not told to stop working:
wait on condvar using mutex.
if work is available to be done:
do the work.
unlock mutex.
clean up.
exit thread.
इस लूप के भीतर काम किया जाता है बशर्ते कि प्रतीक्षा के वापस आने पर कुछ उपलब्ध हो। जब थ्रेड को काम करना बंद करने के लिए फ़्लैग किया गया है (आमतौर पर दूसरे थ्रेड द्वारा बाहर निकलने की स्थिति सेट करने के बाद इस थ्रेड को जगाने के लिए कंडीशन वैरिएबल को किक करते हुए), लूप बाहर निकल जाएगा, म्यूटेक्स अनलॉक हो जाएगा और यह थ्रेड बाहर निकल जाएगा।
उपरोक्त कोड एक एकल-उपभोक्ता मॉडल है क्योंकि म्यूटेक्स लॉक रहता है जबकि काम किया जा रहा है। एक बहु-उपभोक्ता भिन्नता के लिए, आप एक उदाहरण के रूप में उपयोग कर सकते हैं :
thread:
initialise.
lock mutex.
while thread not told to stop working:
wait on condvar using mutex.
if work is available to be done:
copy work to thread local storage.
unlock mutex.
do the work.
lock mutex.
unlock mutex.
clean up.
exit thread.
जो अन्य उपभोक्ताओं को काम करने की अनुमति देता है, जबकि यह काम कर रहा है।
स्थिति चर आपको कुछ स्थिति होने के बजाय किसी अन्य थ्रेड को सूचित करने की अनुमति देने के बजाय कुछ स्थिति के मतदान के बोझ से छुटकारा दिलाता है। एक अन्य सूत्र यह बता सकता है कि वह धागा जो इस प्रकार उपलब्ध है:
lock mutex.
flag work as available.
signal condition variable.
unlock mutex.
आमतौर पर गलत तरीके से कहे जाने वाले वेक्युप्स बहुसंख्यक हमेशा से थे क्योंकि उनके pthread_cond_wait
कॉल (ब्रॉडकास्ट) में कई थ्रेड्स संकेतित किए गए थे , एक म्यूटेक्स के साथ वापस आ जाएगा, काम करेगा, फिर इंतजार करेगा।
तब दूसरा सिगनल थ्रेड बाहर आ सकता है जब कोई काम नहीं करना था। तो आपके पास एक अतिरिक्त चर होना चाहिए जो दर्शाता है कि काम किया जाना चाहिए (यह संक्षेप में म्यूटेक्स-म्यूटेक्स जोड़ी के साथ संरक्षित है - हालांकि इसे बदलने से पहले म्यूटेक्स को लॉक करने के लिए आवश्यक अन्य थ्रेड्स)।
यह था तकनीकी रूप से संभव के लिए एक धागा अन्य प्रक्रिया द्वारा लात मारी जा रहा है बिना एक शर्त प्रतीक्षा से वापस जाने के लिए (यह एक वास्तविक नकली Wakeup है), लेकिन, मेरे सभी कई वर्षों में pthreads पर काम कर रहा है, दोनों के विकास में / कोड की सेवा और एक उपयोगकर्ता के रूप में उनमें से, मुझे कभी भी इनमें से एक नहीं मिला। हो सकता है कि सिर्फ इसलिए कि एचपी एक सभ्य कार्यान्वयन था :-)
किसी भी मामले में, एक ही कोड जिसने गलत मामले को संभाला है, वास्तविक वास्तविक वेकअप को भी संभाला है क्योंकि काम के लिए उपलब्ध ध्वज उन लोगों के लिए सेट नहीं किया जाएगा।