2011-03-03 16 views
5

मान लीजिए कि कुछ हालत चर "cond" एक mutex चर "mutex" से जुड़ा हुआ है। यदि पर कॉल करने के बाद cond पर कोई थ्रेड सो रहा है, और mutex लॉक होने वाला कोई अन्य थ्रेड समाप्त हो गया है, तो क्या इससे कोई फर्क पड़ता है कि pthread_mutex_unlock(&mutex) पर कॉल करने से पहले या उसके बाद pthread_cond_signal(&cond) पर थ्रेड कॉल करता है? क्या इसे म्यूटेक्स को अनलॉक करने की भी आवश्यकता है यदि यह pthread_cond_signal(&cond) पर कॉल करता है, क्योंकि नींद धागा वैसे भी mutex प्राप्त करेगा?एक हालत परिवर्तनीय सिग्नलिंग (pthreads)

संपादित करें: https://computing.llnl.gov/tutorials/pthreads/#ConVarOverview के अनुसार, ") pthread_cond_signal (बुला के बाद म्युटेक्स अनलॉक करने के लिए एक मिलान pthread_cond_wait() दिनचर्या को पूरा करने की अनुमति नहीं जा सकता है और (यह अवरोधित रहेंगे)।" मुझे लगता है कि, अनलॉकिंग, और शायद बाद में, आवश्यक है।

+0

+1 अपने स्वयं के प्रश्न का उत्तर देने के लिए। –

उत्तर

3

आपको pthread_cond_signal पर कॉल करने के बाद हमेशा म्यूटेक्स को अनलॉक करना चाहिए। यहाँ कुछ अच्छा सवाल कर रहे हैं/उत्तर को पढ़ने के लिए:

Calling pthread_cond_signal without locking mutex

यह अभी मेरे पास आते हैं नहीं है, लेकिन मैं बहुत यकीन है कि इसका कोई खास कारण (दौड़ की स्थिति के संदर्भ में) है कि आप डॉन 'है कर रहा हूँ संकेत से पहले mutex अनलॉक करना चाहते हैं।

+0

यदि म्यूटेक्स वैरिएबल को सिग्नल करने और म्यूटेक्स को अनलॉक करने के बाद, थ्रेड तुरंत उस mutex पर 'pthread_mutex_lock() 'को कॉल करता है, तो क्या यह गारंटी है कि पहले' pthread_cond_signal() 'द्वारा लिखे गए धागे को भूखा न करें? – ManRow

+1

@ManRow: प्राथमिक प्राथमिकताओं को सेट किया गया है, तो प्राथमिकता निर्धारण विकल्प में ऐसी गारंटी हो सकती है। अन्यथा, निश्चित रूप से नहीं। –

+2

प्राथमिक कारण प्राथमिकता से बचने से बच रहा है: http://groups.google.com/group/comp.programming.threads/msg/a3721a2fc9b21c64?hl=ky http://stackoverflow.com/questions/4544234/calling- pthread-cond-संकेत के बिना-लॉकिंग-म्युटेक्स/4544494 # 4544494 – ninjalj

4

यदि आप म्यूटेक्स को बंद रखते हैं, तो थ्रेड होने वाला थ्रेड म्यूटेक्स प्राप्त नहीं कर सकता है, इसलिए pthread_cond_wait में ब्लॉक करेगा जो म्यूटेक्स को पुनः प्राप्त करने का इंतजार कर रहा है।

आपको pthread_cond_signal पर कॉल करने के लिए लॉक किए गए म्यूटेक्स को पकड़ने की आवश्यकता नहीं है। वास्तव में, यदि आपका अनुप्रयोग तर्क सिग्नल के साथ काम कर सकता है जब म्यूटेक्स लॉक नहीं होता है तो यह करने का एक बेहतर तरीका है --- ओएस तुरंत प्रतीक्षा थ्रेड शेड्यूल कर सकता है, और इसे सिग्नलिंग के लिए इंतजार नहीं करना पड़ता है आगे बढ़ने से पहले mutex अनलॉक करने के लिए धागा।

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

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