2013-02-18 46 views
7

मान लीजिए कि मेरे पास pthread_mutex_lock() पर कॉल पर अवरुद्ध एकाधिक थ्रेड हैं। जब म्यूटेक्स उपलब्ध हो जाता है, तो क्या पहला थ्रेड जिसे pthread_mutex_lock() कहा जाता है, लॉक मिलता है? यही है, एफआईएफओ आदेश में pthread_mutex_lock() पर कॉल कर रहे हैं? यदि नहीं, तो क्या, अगर कोई है, तो वे क्या हैं? धन्यवाद!एकाधिक थ्रेड के साथ 'pthread_mutex_lock()' wake ऑर्डर क्या है?

उत्तर

6

जब म्यूटेक्स उपलब्ध हो जाता है, तो क्या पहला धागा pthread_mutex_lock() लॉक प्राप्त करता है?

नहीं। प्रतीक्षा धागे में से एक लॉक हो जाता है, लेकिन जो इसे प्राप्त करता है वह निर्धारित नहीं होता है।

फीफो ऑर्डर?

फीफो म्यूटेक्स पहले से ही एक पैटर्न है। Implementing a FIFO mutex in pthreads

+0

फीफो द्वारा मेरा मतलब था कि यह उपलब्ध होने पर लॉक प्राप्त करने के लिए पहले 'pthread_mutex_lock' को कॉल करने वाला पहला धागा है और बाद में थ्रेड के लिए। मान लीजिए कि मैं अपना खुद का कार्यान्वयन कर रहा हूं। धन्यवाद। – shanet

+0

@shanet: * "मेरा मतलब है कि यह उपलब्ध होने पर लॉक प्राप्त करने के लिए पहले 'pthread_mutex_lock' को कॉल करने वाला पहला धागा है" * - हाँ, यह वही है जो फीफो म्यूटेक्स है। – LihO

1

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

  1. प्राप्त नहीं म्युटेक्स:

    दो धागे कि ऐसा करने पर विचार करें।

  2. कुछ डेटा समायोजित करें।
  3. म्यूटेक्स को छोड़ दें।
  4. जाओ कदम 1.

अब दो धागे एक सिंगल कोर CPU पर इस कोड चलाने की कल्पना। यह स्पष्ट होना चाहिए कि फीफो म्यूटेक्स व्यवहार के परिणामस्वरूप प्रति संदर्भ स्विच "कुछ डेटा समायोजित" होगा - सबसे खराब संभव परिणाम।

बेशक, उचित कार्यान्वयन आम तौर पर निष्पक्षता के लिए कुछ देते हैं। हम नहीं चाहते कि एक धागा आगे की प्रगति न करे। लेकिन यह शायद ही कभी एक एफआईएफओ कार्यान्वयन को सही ठहराता है!

+0

"उचित" का आपका विचार सबसे अधिक अनुकूल नहीं है। विशेष रूप से यह रीयलटाइम आवश्यकताओं के साथ संगत नहीं है; एक धागा जो तेजी से ताले और म्यूटेक्स को अनलॉक करता है, किसी अन्य थ्रेड में प्रगति को आगे बढ़ाएगा। प्रत्येक प्राथमिकता स्तर के भीतर एफआईएफओ आदेश सामान्य तरीके से म्यूटेक्स को मजबूत रीयलटाइम उपयोग के लिए व्यवहार करना चाहिए। –

+0

@ आर .. POSIX mutexes नहीं हैं, और वास्तविक समय होने का इरादा नहीं है।वे पूरी तरह से अनुचित होने के बिना प्रक्रिया की अगली प्रगति को अधिकतम करने के उद्देश्य से हैं। –

+0

प्रति पॉज़िक्स, "pthread_mutex_unlock() फ़ंक्शन mutex द्वारा संदर्भित म्यूटेक्स ऑब्जेक्ट को रिलीज़ करेगा। जिस तरीके से एक म्यूटेक्स जारी किया जाता है वह म्यूटेक्स के प्रकार विशेषता पर निर्भर होता है। यदि mthx द्वारा संदर्भित mutex ऑब्जेक्ट पर थ्रेड अवरुद्ध होते हैं तो pthread_mutex_unlock () कहा जाता है, जिसके परिणामस्वरूप म्यूटेक्स उपलब्ध हो रहा है, ** शेड्यूलिंग नीति निर्धारित करेगी कि कौन सा धागा mutex ** प्राप्त करेगा। " (जोर मेरा) –

1

"अगर mthx द्वारा संदर्भित म्यूटेक्स ऑब्जेक्ट पर थ्रेड अवरुद्ध होते हैं तो pthread_mutex_unlock() कहा जाता है, जिसके परिणामस्वरूप म्यूटक्स उपलब्ध हो जाता है, शेड्यूलिंग नीति निर्धारित करेगी कि कौन सा धागा म्यूटेक्स प्राप्त करेगा।"

इसके अलावा, आपके प्रश्न का उत्तर POSIX मानक द्वारा निर्दिष्ट नहीं है। कार्यान्वयन द्वारा किए गए विकल्पों के मुताबिक, यह यादृच्छिक हो सकता है, या यह फीफो या एलआईएफओ या किसी अन्य आदेश में हो सकता है।