2011-06-01 14 views
9

लिनक्स प्रोग्रामिंग इंटरफ़ेस किताब कोड का एक टुकड़ा (निर्माता/उपभोक्ता) कैसे हालत चर काम करता है दिखाने के लिए है का उपयोग करने के लिए? हम इसे if में क्यों उपयोग नहीं करते हैं?कैसे स्थिति चर

उत्तर

12

क्योंकि pthread_cond_signal() को एक से अधिक थ्रेड को स्थिति चर पर प्रतीक्षा करने की अनुमति है। इसलिए जागने के बाद आपको शर्त को दोबारा जांचना होगा, क्योंकि कुछ अन्य धागे जाग गए होंगे और इसे आपके आगे बदल देंगे।

यदि आपको पता है कि आपके पास केवल एक थ्रेड प्रतीक्षा है, और आप सुनिश्चित हैं कि भविष्य में कोई भी प्रोग्राम किसी अन्य थ्रेड को जोड़ने के लिए प्रोग्राम में कहीं और कोड को संशोधित नहीं करेगा, तो आप if का उपयोग कर सकते हैं। लेकिन आप निश्चित रूप से कभी नहीं जानते हैं, इसलिए हमेशा while का उपयोग करें।

[अद्यतन]

ninjalj एक टिप्पणी में बताते हैं, मेरे जवाब "नकली wakeups" का उल्लेख करने में नाकाम रहने के लिए अधूरा है। उदाहरण के लिए, POSIX मानक यह स्पष्ट करता है कि यदि प्रतीक्षा थ्रेड को सिग्नल प्राप्त होता है (उदा। मारने() के माध्यम से), pthread_cond_wait() 0 को वापस कर सकता है भले ही कोई अन्य थ्रेड हालत परिवर्तनीय संकेत न करे। मानक संदिग्ध है (मेरे विचार में) कि प्रतीक्षा धागा किसी भी कारण से जागृत नहीं हो सकता है ... लेकिन नीचे की रेखा है: हमेशाwhile का उपयोग करें, if पर नहीं।

+6

इसके अतिरिक्त, नकली वेकअप हो सकते हैं, इसलिए हमेशा 'while' का उपयोग करें। – ninjalj

+0

आपका क्या मतलब है: नकली wakeups –

+1

@ माजिद अज़ीमी को कंडीशन वैरिएबल को किसी स्पष्ट कारण के लिए संकेतित नहीं किया जा सकता है, न सिर्फ इसलिए कि किसी को pthread_cond_signal/प्रसारण – nos