दिलचस्प पोस्ट
जावास्क्रिप्ट में स्ट्रिंग मान की गणना, eval का उपयोग नहीं कर रहा है <My code> में त्रुटि: प्रकार का 'क्लोजर' ऑब्जेक्ट सेनेटटेबल नहीं है क्या मैं यूआरएल के अंदर एक प्रतीक (@) का उपयोग कर सकता हूँ? javascript regexp सभी विशेष वर्णों को हटा दें iphone / ipad: बिल्कुल कैसे NSAttributedString का उपयोग करें? कैसे। Htaccess में RewriteBase काम करता है कैसे REST URIs संस्करण को एक regexp के साथ ओवरलैपिंग मैचों को कैसे ढूंढें? एक अलग रंग के साथ मानक एंड्रॉइड बटन मैं सभी डुप्लिकेट को कैसे निकाल सकता हूं ताकि कोई डेटा फ्रेम में आर में छोड़ा जा सके? अपरिचित SSL संदेश, सादा टेक्स्ट कनेक्शन? अपवाद सीएसएस एक तत्व है बच्चों की संख्या का पता लगा सकता है? AngularJS छिपा क्षेत्र मान नहीं भेजता है एंड्रॉइड – गैलरी में छवि को बचाएं jQuery को विशिष्ट विकल्प टैग टेक्स्ट मिलता है

म्यूटक्स लॉक किए बिना pthread_cond_signal को कॉल करना

मैंने कहीं पढ़ा है कि हमें pthread_cond_signal को कॉल करने से पहले म्यूट एक्स को लॉक करना चाहिए और इसे कॉल करने के बाद म्यूटटेक को अनलॉक करना चाहिए:

Pthread_cond_signal () दिनचर्या का प्रयोग एक अन्य धागा संकेत (या जाग) करने के लिए किया जाता है जो स्थिति चर पर प्रतीक्षा कर रहा है। इसे म्यूट एक्स लॉक होने के बाद बुलाया जाना चाहिए, और pthread_cond_wait () को पूर्ण करने के लिए रूटीन के लिए म्यूट एक्स अनलॉक करना होगा।

मेरा प्रश्न यह है कि क्या mutex लॉक किए बिना pthread_cond_signal या pthread_cond_broadcast विधियों को कॉल करना ठीक नहीं है?

वेब के समाधान से एकत्रित समाधान "म्यूटक्स लॉक किए बिना pthread_cond_signal को कॉल करना"

यदि आप कोड-पथ में म्यूटक्स को लॉक नहीं करते हैं जो स्थिति और संकेतों को बदलता है, तो आप जागरूकता खो सकते हैं। प्रक्रियाओं की इस जोड़ी पर विचार करें:

प्रक्रिया ए:

pthread_mutex_lock(&mutex); while (condition == FALSE) pthread_cond_wait(&cond, &mutex); pthread_mutex_unlock(&mutex); 

प्रक्रिया बी (गलत):

 condition = TRUE; pthread_cond_signal(&cond); 

फिर निर्देशों के इस संभव अंतराल पर विचार करें, जहां condition FALSE रूप में शुरू होती है:

 Process A Process B pthread_mutex_lock(&mutex); while (condition == FALSE) condition = TRUE; pthread_cond_signal(&cond); pthread_cond_wait(&cond, &mutex); 

यह condition अब TRUE , लेकिन प्रक्रिया ए शर्त चर पर इंतजार कर रहा है – यह wakeup संकेत को याद किया। अगर हम mutex को लॉक करने के लिए प्रोसेस बी को बदलते हैं:

प्रक्रिया बी (सही):

 pthread_mutex_lock(&mutex); condition = TRUE; pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); 

… तो ऊपर नहीं हो सकता; जागना कभी नहीं छोड़ेगा।

(ध्यान दें कि आप वास्तव में pthread_cond_signal() को pthread_cond_signal() के बाद ही स्थानांतरित कर सकते हैं , लेकिन यह थ्रेड के कम इष्टतम शेड्यूलिंग का परिणाम हो सकता है, और आपने स्थिति को बदलने के कारण पहले से ही इस कोड के रास्ते में म्यूट को लॉक किया है)।

इस मैनुअल के अनुसार:

pthread_cond_broadcast() या pthread_cond_signal() फ़ंक्शंस को एक धागे से बुलाया जा सकता है कि वर्तमान में वह म्यूट एक्स मालिक है या नहीं pthread_cond_wait() या pthread_cond_timedwait() कॉल करने वाले थ्रेड्स ने अपनी प्रतीक्षा के दौरान स्थिति चर के साथ जुड़े हैं; हालांकि, यदि अनुमान लगाने योग्य शेड्यूलिंग व्यवहार की आवश्यकता है, तो उस म्यूट को थ्रेड को pthread_cond_broadcast() या pthread_cond_signal() द्वारा लॉक किया जाएगा।

अपेक्षित शेड्यूलिंग व्यवहार वक्तव्य का अर्थ डेव बटहॉफ ( प्रोग्रामिंग के प्रोग्रामिंग के साथ पॉसिक्स थ्रेड्स ) द्वारा comp.programming.threads पर समझाया गया है और यहां उपलब्ध है ।

सीएएफ, आपके नमूना कोड में, प्रक्रिया बी पहले म्यूट एक्स लॉक किए बिना condition को संशोधित करता है। अगर प्रक्रिया बी ने उस संशोधन के दौरान म्यूट एक्स को लॉक किया है, और फिर pthread_cond_signal कॉल करने से पहले म्यूट एक्स को अनलॉक किया है, तो कोई समस्या नहीं होगी — क्या मैं इसके बारे में सही हूं?

मुझे विश्वास है कि सीएएफ की स्थिति सही है: म्यूटक्स लॉक के मालिक के बिना pthread_cond_signal को कॉल करना एक बुरी आइडिया है लेकिन सीएएफ का उदाहरण वास्तव में इस स्थिति के समर्थन में साक्ष्य नहीं है; यह केवल बहुत कमजोर (व्यावहारिक रूप से स्वयं-स्पष्ट) स्थिति के समर्थन में सबूत है कि जब तक आप उस म्यूटिक्स को पहले लॉक नहीं कर लेते हैं, तब तक एक म्यूट एक्स द्वारा सुरक्षित साझा राज्य को संशोधित करने के लिए यह एक बुरी आइडिया है।

क्या कोई कुछ नमूना कोड प्रदान करता है जिसमें pthread_cond_signal कॉल करने के बाद pthread_mutex_unlock द्वारा सही व्यवहार उत्पन्न होता है, लेकिन pthread_mutex_unlock कॉल करने के बाद pthread_cond_signal उपज गलत pthread_mutex_unlock बाद?