मैन पेज को उद्धृत करने के लिए:
हालत चर का उपयोग करते समय हमेशा एक बूलियन विधेय होता है जिसमें प्रत्येक स्थिति से जुड़े साझा चर शामिल होते हैं जो कि थ्रेड के आगे बढ़ने के लिए सही है। Pthread_cond_timedwait () या pthread_cond_wait () फ़ंक्शन से गंभीर वेकअप हो सकते हैं। चूंकि preadread_cond_timedwait () या pthread_cond_wait () से वापसी इस predicate के मूल्य के बारे में कुछ भी नहीं बताती है, ऐसे रिटर्न पर predicate का पुनर्मूल्यांकन किया जाना चाहिए।
pthread_cond_wait
यदि आप इसे संकेत नहीं दिया है , तो भी, वापस कर सकते हैं। पहली नज़र में कम से कम, कि बहुत नृशंस लगता है। यह एक फ़ंक्शन की तरह होगा जो गलत मूल्य को बेतरतीब ढंग से लौटाता है या बेतरतीब ढंग से वापस लौटता है क्योंकि यह वास्तव में एक उचित रिटर्न स्टेटमेंट तक पहुंच गया है। यह एक प्रमुख बग की तरह लगता है। लेकिन तथ्य यह है कि वे इसे ठीक करने के बजाय मैन पेज में दस्तावेज़ करने के लिए चुना है, यह इंगित करने के लिए प्रतीत होता है कि वहाँ एक वैध कारण है कि pthread_cond_wait
अंत में स्वाभाविक रूप से जागने क्यों है। मुमकिन है, वहाँ यह कैसे काम करता है कि यह बनाता है ताकि है कि मदद नहीं किया जा सकता है के बारे में कुछ आंतरिक है। सवाल यह है कि
क्यों करता है pthread_cond_wait
नकली तौर पर वापसी? यह गारंटी क्यों नहीं दे सकता है कि यह केवल तभी जागा होगा जब इसे ठीक से संकेत दिया गया हो? क्या कोई इसके सहज व्यवहार का कारण बता सकता है?
pthread_cond_(timed)wait
: "यदि कोई सिग्नल डिलीवर होता है ... थ्रेड फिर से शुरू हो जाता है जैसे कि कंडीशन वैरिएबल का इंतजार कर रहा है बाधित नहीं किया गया, या यह स्पुरियस वेकअप के कारण शून्य वापस आ जाएगा "। अन्य अवरुद्ध कार्य EINTR
एक संकेत (जैसे read
) से बाधित होने पर इंगित करते हैं, या फिर से शुरू करने के लिए आवश्यक होते हैं (जैसे pthread_mutex_lock
)। अतः यदि स्फ़ूर्त जागने के कोई अन्य कारण नहीं थे pthread_cond_wait
, तो उन दोनों की तरह परिभाषित किया जा सकता था।