आदमी पेज के शब्दों में:pthread_cond_wait में नकली wakeups क्यों हैं?
हालत चरों का उपयोग करते वहाँ हमेशा एक बूलियन साझा प्रत्येक शर्त प्रतीक्षा यह सच है अगर धागा आगे बढ़ना चाहिए के साथ जुड़े चर शामिल विधेय है। Pthread_cond_timedwait() या pthread_cond_wait() फ़ंक्शंस से नकली wakeups हो सकता है। चूंकि pthread_cond_timedwait() या pthread_cond_wait() से वापसी इस predicate के मूल्य के बारे में कुछ भी नहीं दर्शाती है, इस तरह के रिटर्न पर भविष्यवाणी का फिर से मूल्यांकन किया जाना चाहिए।
तो, pthread_cond_wait
वापस लौटा सकता है अगर आपने इसे संकेत नहीं दिया है। कम से कम पहली नज़र में, यह बहुत अत्याचारी लगता है। यह एक ऐसे फ़ंक्शन की तरह होगा जो गलत मूल्य को यादृच्छिक रूप से वापस कर देता है या वास्तव में उचित वापसी कथन तक पहुंचने से पहले यादृच्छिक रूप से लौटाया जाता है। यह एक प्रमुख बग की तरह लगता है। लेकिन तथ्य यह है कि उन्होंने इसे ठीक करने के बजाए मैन पेज में दस्तावेज करने के लिए चुना है, ऐसा लगता है कि एक वैध कारण है कि pthread_cond_wait
तेजी से जागने के लिए समाप्त होता है। संभवतः, यह कैसे काम करता है इसके बारे में कुछ अंतर्निहित है जो इसे बनाता है ताकि इसकी सहायता नहीं की जा सके। सवाल क्या है।
क्योंpthread_cond_wait
नकली वापसी करता है? यह गारंटी क्यों नहीं दे सकता है कि यह ठीक से संकेतित होने पर ही जागने जा रहा है? क्या कोई इसके नकली व्यवहार के कारण को समझा सकता है?
मुझे लगता है कि जब भी प्रक्रिया सिग्नल पकड़ लेती है तो उसे लौटने के साथ कुछ करना पड़ता है। सिग्नल इंटरप्ट होने के बाद अधिकांश * निक्सेस अवरुद्ध कॉल को पुनरारंभ नहीं करते हैं; वे सिर्फ एक त्रुटि कोड सेट/वापस करते हैं जो कहते हैं कि एक संकेत हुआ। – cHao
@cHao: हालांकि ध्यान दें कि क्योंकि कंडीशन चर के पास * अन्य * नकली वेक-अप के कारण हैं, सिग्नल को संभालना 'pthread_cond_ (timed) प्रतीक्षा' के लिए कोई त्रुटि नहीं है: "अगर सिग्नल वितरित किया जाता है ... थ्रेड कंडीशन वैरिएबल के लिए इंतजार करना शुरू कर देता है जैसे कि यह बाधित नहीं हुआ था, या यह नकली wakeup के कारण शून्य वापस आ जाएगा "। सिग्नल द्वारा बाधित होने पर अन्य अवरुद्ध कार्य 'EINTR' इंगित करते हैं (उदा।' Read'), या फिर से शुरू करने की आवश्यकता होती है (उदा। 'Pthread_mutex_lock')। तो अगर नकली जागने के लिए कोई अन्य कारण नहीं थे, तो 'pthread_cond_wait' को इनमें से किसी एक की तरह परिभाषित किया जा सकता था। –
विकिपीडिया पर एक संबंधित लेख: [नकली wakeup] (http://en.wikipedia.org/wiki/Spurious_wakeup) – Palec