2011-10-14 14 views
8

के लिए इंतजार क्यों आप थोड़ी देर के पाश की जरूरत क्यों आप थोड़ी देर के पाश यहाँ की क्या ज़रूरत है आप इस कोडजबकि एक शर्त चर

pthread_mutex_lock(&cam->video_lock); 
while(cam->status == WAIT_DISPLAY) // <-- Why is this a 'while' and not an 'if'? 
    pthread_cond_wait(&cam->video_cond, &cam->video_lock); 
pthread_mutex_unlock(&cam->video_lock); 

मेरा प्रश्न है, कहो। pthread_cond_wait सिग्नलिंग थ्रेड सिग्नल cam_video_cond तक बस प्रतीक्षा करें? ठीक है, मुझे पता है तुम एक मामले कैम> स्थितिWAIT_DISPAY के बराबर नहीं है जहां जब pthread_cond_wait कहा जाता है हो सकता है, लेकिन इस मामले में आप सिर्फ बल्कि का उपयोग करते समय की तुलना में एक अगर हालत के माध्यम से यह जांच कर सकता है

क्या मुझे यहां कुछ याद आ रही है? की मेरी समझ pthread_cond_wait यह है कि अगर cam_video_cond संकेत नहीं दिया गया है तो यह अनंत के लिए प्रतीक्षा करता है। इसके अलावा, यह cam_video_lock म्यूटेक्स को बुलाए जाने पर अनलॉक करता है, लेकिन जब स्थिति को संकेत दिया जाता है, तो लौटने से पहले, यह cam_video_lock को बंद करता है। क्या मैं सही हू?

+0

वही सवाल, http://www.unix.com/programming/149791- शर्त- variables।एचटीएमएल – MetallicPriest

+0

[नकली wakeup] [http://en.wikipedia.org/wiki/Spurious_wakeup) –

उत्तर

17

यह अनुशंसा की जाती है कि सभी धागे pthread_cond_wait से लौटने के बाद की स्थिति की जांच क्योंकि वहाँ कई कारण हालत सच नहीं हो सकता है कर रहे हैं। इन कारणों में से एक एक नकली wakeupup है; यानी, कोई धागा जागृत हो सकता है भले ही कोई थ्रेड स्थिति को इंगित न करे।

स्रोत: Spurious wakeup

2

प्रदर्शन कारणों से, POSIX API ओएस को आपके धागे को जागने की अनुमति देता है भले ही स्थिति पूरी नहीं हुई हो (जिसे spurious wakeup कहा जाता है)।

9

नकली wakeups एक कारण हैं, लेकिन वैध लेकिन बाहरी wakeups एक और कर रहे हैं।

पर विचार करें:

  1. आप एक कतार पर एक नौकरी डाल दिया।

  2. आप शर्त चर संकेत, धागा ए

  3. जागने आप एक कतार पर एक नौकरी डाल दिया।

  4. आप शर्त चर संकेत, धागा बी

  5. थ्रेड शेड्यूल हो जाता है जागने, पहले काम करता है।

  6. थ्रेड ए कतार को खाली नहीं पाया और दूसरा काम करता है।

  7. थ्रेड बी निर्धारित हो गया है, जाग गया है, लेकिन कतार अभी भी खाली है।

संबंधित मुद्दे