दिलचस्प पोस्ट
अजगर – स्ट्रिंग में चार ढूंढें – क्या मैं सभी अनुक्रमित प्राप्त कर सकता हूं? स्ट्रिंग। (या अन्य स्ट्रिंग संशोधन) बदलें काम नहीं कर रहा है एचटीएमएल के चयन पर मापदंडों को कैसे पारित करें SQL स्टेटमेंट में बैकटीक और वर्ग ब्रैकेट के बीच अंतर क्या है? स्थैतिक क्षेत्रों को विरासत में मिला है? सिस्टम रीबूट के बाद प्रसारण रिसीवर में एक चेतावनी संवाद दिखाएं JQuery UI – तिथि पिकर, विशिष्ट तिथियों को अक्षम करना जावास्क्रिप्ट में एक सरणी में डुप्लिकेट मान को कैसे गिनना रेडियो बटन को कैसे अनचेक करें? प्रीफ़ेचिंग के उदाहरण? क्यों mysqli num_rows हमेशा 0 वापस आता है? मैं जावा में जावास्क्रिप्ट का उपयोग कैसे कर सकता हूं? AlertDialog के लिए थीम को कैसे बदलना है मैं जावास्क्रिप्ट में दो तिथियों के बीच अंतर कैसे प्राप्त करूं? PerformSelector का उपयोग कैसे करें: withObject: afterDelay: कोको में प्राचीन प्रकारों के साथ?

म्यूटक्स लॉक किए बिना 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 बाद?