म्यूटेक्स क्या है?


651

एक म्यूटेक्स एक प्रोग्रामिंग अवधारणा है जिसका अक्सर बहु-थ्रेडिंग समस्याओं को हल करने के लिए उपयोग किया जाता है। समुदाय के लिए मेरा प्रश्न:

म्यूटेक्स क्या है और आप इसका उपयोग कैसे करते हैं?


2
यहाँ अंतर पर एक अच्छा लेख है: barrgroup.com/Embedded-Systems/How-To/RTOS-Mutex-Semaphore
एडम डेविस

म्यूटेक्स पर एक ट्यूटोरियल चीजों को स्पष्ट करने में मदद कर सकता है: stackoverflow.com/questions/4989451/mutex-example-tutorial
Nav

1
एक म्यूटेक्स एक गैस स्टेशन पर एक बाथरूम कुंजी की तरह है, यह सुनिश्चित करता है कि एक समय में केवल एक ही व्यक्ति बाथरूम का उपयोग कर सकता है और कोई और शौचालय का उपयोग नहीं कर सकता जब तक कि वर्तमान रहने वाला समाप्त नहीं हो जाता है और कुंजी वापस आ जाती है।
17

जवाबों:


2148

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

चिकन को म्यूटेक्स के साथ बदलें और धागे के साथ व्यक्ति और आपको मूल रूप से म्यूटेक्स की अवधारणा है।

बेशक, रबड़ म्यूटेक्स जैसी कोई चीज नहीं है। केवल रबर चिकन। मेरी बिल्लियों के पास एक बार एक रबर माउस था, लेकिन उन्होंने इसे खा लिया।

बेशक, इससे पहले कि आप रबर चिकन का उपयोग करें, आपको खुद से यह पूछने की ज़रूरत है कि क्या आपको वास्तव में एक कमरे में 5 लोगों की ज़रूरत है और क्या यह सब काम करने वाले अपने दम पर कमरे में एक व्यक्ति के साथ आसान नहीं होगा। असल में, यह सिर्फ सादृश्य का विस्तार कर रहा है, लेकिन आपको यह विचार मिलता है।


9
बहुत बढ़िया जवाब। क्या यह तर्क दिया जा सकता है कि म्यूटेक्स वास्तव में नियम हैं जो चिकन को पारित होने से रोकते हैं? और चिकन वह चीज है जिसे आप लॉक कर रहे हैं?
सिरयाकोट जू

3
@SirYakalot, आपका मतलब है कि चिकन संसाधन है, और मध्यस्थ म्यूटेक्स है?
ओवेन

155
चिकन म्यूटेक्स है । मुई को फहराते हुए लोग .. चिकन प्रतिस्पर्धा के धागे हैं । मॉडरेटर ओएस है । जब लोग चिकन का अनुरोध करते हैं, तो वे ताला अनुरोध करते हैं। जब आप mutex.lock () कहते हैं, तो आपका धागा लॉक में बंद हो जाता है () और OS को लॉक करने का अनुरोध करता है। जब OS यह पता लगाता है कि म्यूटेक्स को एक थ्रेड से जारी किया गया था, तो यह आपको इसे देता है, और लॉक () रिटर्न - म्यूटेक्स अब आपका और केवल आपका है। कोई और इसे चुरा नहीं सकता, क्योंकि कॉलिंग लॉक () उसे ब्लॉक कर देगा। वहाँ भी है try_lock () जो ब्लॉक करेगा और सही लौटेगा जब mutex आपका और तुरंत झूठा हो अगर mutex उपयोग में है।
Пет14р Петров

4
आप जीनियस हैं। क्या आप मॉनिटर को समझाने के लिए रबर चिकन रूपक का उपयोग कर सकते हैं?
रिकार्डो

98
कभी-कभी कुछ प्रोग्रामिंग अवधारणाओं की उत्पत्ति स्पष्ट नहीं होती है। एक नौसिखिया सोचकर घबरा सकता है कि हर कोई रेगेक्स के बारे में क्यों बात कर रहा है। यह स्पष्ट नहीं है कि रेगेक्स [रेग] ular [पूर्व] दबाव के लिए कम है। इसी तरह, म्यूटेक्स [म्यूट] ual [एक्स] क्ल्यूज़न के लिए छोटा है। यह शब्द के अर्थ को पचाने में आसान बना सकता है। @ TheSmurf ने उनके उत्तर में इसे जोड़ा, लेकिन ऐतिहासिक उद्देश्यों के लिए इसे यहाँ जोड़ना अच्छा हो सकता है।
डोडज़ी डेजाकुमा

137

एक म्यूटेक्स एक पारस्परिक रूप से अनन्य झंडा है। यह कोड के एक भाग के लिए एक गेट कीपर के रूप में कार्य करता है जो एक धागा को सभी दूसरों तक पहुंच और अवरुद्ध करने की अनुमति देता है। यह सुनिश्चित करता है कि नियंत्रित किए जा रहे कोड को एक बार में केवल एक ही धागे से मारा जाएगा। बस जब आप कर रहे हों तो म्यूटेक्स को जारी करना सुनिश्चित करें। :)


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

72

आपसी बहिष्कार। यहाँ इस पर विकिपीडिया प्रविष्टि है:

http://en.wikipedia.org/wiki/Mutual_exclusion

एक म्यूटेक्स का बिंदु दो थ्रेड्स को सिंक्रनाइज़ करना है। जब आपके पास एकल संसाधन तक पहुँचने के लिए दो सूत्र होते हैं, तो सामान्य पैटर्न कोड में प्रवेश करने से पहले म्यूटेक्स को सेट करने के लिए कोड प्रयास का पहला ब्लॉक होता है। जब दूसरा कोड ब्लॉक एक्सेस का प्रयास करता है, तो यह देखता है कि म्यूटेक्स सेट है और तब तक इंतजार करता है जब तक कि कोड का पहला ब्लॉक पूरा नहीं हो जाता (और म्यूटेक्स को अन-सेट करता है), तब तक जारी रहता है।

यह कैसे पूरा किया जाता है इसका विशिष्ट विवरण प्रोग्रामिंग भाषा द्वारा स्पष्ट रूप से भिन्न होता है।


64

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

अवधारणा को "पारस्परिक बहिष्करण" (लघु म्यूटेक्स) कहा जाता है, और यह सुनिश्चित करने का एक तरीका है कि उस संसाधन आदि का उपयोग करके उस क्षेत्र के अंदर केवल एक धागे की अनुमति है।

उनका उपयोग कैसे करें भाषा विशिष्ट है, लेकिन एक ऑपरेटिंग सिस्टम म्यूटेक्स के आधार पर अक्सर (यदि हमेशा नहीं) है।

प्रतिमान के कारण कुछ भाषाओं को इस निर्माण की आवश्यकता नहीं है, उदाहरण के लिए कार्यात्मक प्रोग्रामिंग (हास्केल, एमएल अच्छे उदाहरण हैं)।


26

C # में, सामान्य म्यूटेक्स का उपयोग मॉनिटर है । प्रकार ' System.Threading.Monitor ' है। इसका इस्तेमाल ' लॉक (ऑब्जेक्ट) ' स्टेटमेंट के जरिए किया जा सकता है । इसका उपयोग का एक उदाहरण एक सिंगलटन वर्ग का निर्माण करते समय है।

private static readonly Object instanceLock = new Object();
private static MySingleton instance;
public static MySingleton Instance
{
    lock(instanceLock)
    {
        if(instance == null)
        {
            instance = new MySingleton();
        }
        return instance;
    }
}

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

स्थैतिक सदस्य के किसी भी प्रकार के सिंक्रनाइज़ेशन लॉक स्टेटमेंट का उपयोग कर सकते हैं।


1
यह एक कार्यान्वयन पर निर्भर उत्तर है। इसके अलावा, सीएस में एक मॉनिटर म्यूटेक्स से अलग है। मॉनिटर्स में एक सिंक्रोनाइज़ेशन मैकेनिज़्म है लेकिन म्यूटेक्स केवल इस चीज़ को लॉक करता है जब तक कि ज़रूरत न हो। कार्यान्वयन विवरण या C # शब्दार्थ के बारे में IDK, लेकिन मुझे लगता है कि प्रश्न का संदर्भ व्यापक है
marcoslhc

23

म्यूटेक्स क्या है ?

म्यूटेक्स (वास्तव में, म्यूटेक्स शब्द आपसी बहिष्कार के लिए छोटा है) जिसे स्पिनलॉक के रूप में भी जाना जाता है, सबसे सरल तुल्यकालन उपकरण है जिसका उपयोग महत्वपूर्ण क्षेत्रों की सुरक्षा के लिए किया जाता है और इस प्रकार दौड़ की स्थिति को रोका जाता है। यह एक महत्वपूर्ण खंड में प्रवेश करने से पहले एक थ्रेड को लॉक प्राप्त करना होगा (महत्वपूर्ण अनुभाग में बहु थ्रेड्स एक साझा करने के लिए एक सामान्य चर साझा करते हैं, एक तालिका को अपडेट करते हुए, एक फ़ाइल और इसी तरह से लिखते हैं), यह तब लॉक जारी करता है जब यह महत्वपूर्ण खंड छोड़ देता है।

रेस कंडीशन क्या है ?

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

वास्तविक जीवन उदाहरण:

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

चिकन को म्यूटेक्स के साथ बदलें और धागे के साथ व्यक्ति और आपको मूल रूप से म्यूटेक्स की अवधारणा है।

@Xetius

C # में उपयोग:

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

using System;
using System.Threading;

class Example
{
    // Create a new Mutex. The creating thread does not own the mutex.
    private static Mutex mut = new Mutex();
    private const int numIterations = 1;
    private const int numThreads = 3;

    static void Main()
    {
        // Create the threads that will use the protected resource.
        for(int i = 0; i < numThreads; i++)
        {
            Thread newThread = new Thread(new ThreadStart(ThreadProc));
            newThread.Name = String.Format("Thread{0}", i + 1);
            newThread.Start();
        }

        // The main thread exits, but the application continues to
        // run until all foreground threads have exited.
    }

    private static void ThreadProc()
    {
        for(int i = 0; i < numIterations; i++)
        {
            UseResource();
        }
    }

    // This method represents a resource that must be synchronized
    // so that only one thread at a time can enter.
    private static void UseResource()
    {
        // Wait until it is safe to enter.
        Console.WriteLine("{0} is requesting the mutex", 
                          Thread.CurrentThread.Name);
        mut.WaitOne();

        Console.WriteLine("{0} has entered the protected area", 
                          Thread.CurrentThread.Name);

        // Place code to access non-reentrant resources here.

        // Simulate some work.
        Thread.Sleep(500);

        Console.WriteLine("{0} is leaving the protected area", 
            Thread.CurrentThread.Name);

        // Release the Mutex.
        mut.ReleaseMutex();
        Console.WriteLine("{0} has released the mutex", 
            Thread.CurrentThread.Name);
    }
}
// The example displays output like the following:
//       Thread1 is requesting the mutex
//       Thread2 is requesting the mutex
//       Thread1 has entered the protected area
//       Thread3 is requesting the mutex
//       Thread1 is leaving the protected area
//       Thread1 has released the mutex
//       Thread3 has entered the protected area
//       Thread3 is leaving the protected area
//       Thread3 has released the mutex
//       Thread2 has entered the protected area
//       Thread2 is leaving the protected area
//       Thread2 has released the mutex

MSDN संदर्भ Mutex


1
एक बहुत अच्छा उदाहरण
Siwei शेन

21

यहाँ कुछ महान उत्तर दिए गए हैं, म्यूटेक्स क्या है, यह समझाने के लिए एक और बढ़िया सादृश्य है:

एक कुंजी के साथ एकल शौचालय पर विचार करें । जब कोई प्रवेश करता है, तो वे चाबी लेते हैं और शौचालय पर कब्जा कर लिया जाता है । यदि किसी और को शौचालय का उपयोग करने की आवश्यकता है, तो उन्हें एक कतार में इंतजार करना होगा । जब शौचालय में व्यक्ति किया जाता है , तो वे कतार में अगले व्यक्ति को चाबी देते हैं। समझ में आता है, है ना?

कहानी में शौचालय को एक साझा संसाधन और एक म्यूटेक्स की कुंजी में बदलें । शौचालय की चाबी लेना (ताला प्राप्त करना) आपको इसका उपयोग करने की अनुमति देता है। यदि कोई कुंजी नहीं है (ताला बंद है) तो आपको इंतजार करना होगा। जब कुंजी को उस व्यक्ति द्वारा लौटा दिया जाता है ( लॉक रिलीज़ करें ) तो आप इसे प्राप्त करने के लिए स्वतंत्र हैं।


लेकिन सी # उदाहरण आपकी कतार के समर्थन का समर्थन नहीं करता है, "कतार में अगले व्यक्ति की कुंजी पास करें"। उदाहरण एक स्टैक या यादृच्छिक प्रदर्शित कर रहा है। 1, 2, और 3 सभी उस क्रम में पहुंच का अनुरोध करते हैं। पहले संरक्षित क्षेत्र में एक को अनुमति दी जाती है, और फिर तीन को अनुमति दी जाती है। एक कतार ने दूसरे को दिया होगा।
डॉनवनीसेन

मैं किसी भी ठोस कार्यान्वयन, या ठोस प्रोग्रामिंग भाषा का उल्लेख नहीं कर रहा था। मेरा उदाहरण एक सिद्धांत के रूप में म्यूटेक्स के उच्च स्तर के अमूर्त से संबंधित है।
चेन ए।

18

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

इस समस्या का हल MUTEX है। MUTEX एक तरह का लॉक होता है जो एक बार में एक थ्रेड को लॉक करता है। यदि कोई अन्य थ्रेड इसे लॉक करना चाहता है, तो थ्रेड बस अवरुद्ध हो जाता है।

इस पीडीएफ फाइल लिंक में MUTEX विषय वास्तव में पढ़ने लायक है।


"MUTEX विषय" से आपका तात्पर्य सेमाफोरस सेक्शन से है, क्योंकि इसके उदाहरण बाइनरी सेमाफोर्स के हैं, है ना?
कार्ल जी

2
अच्छी तरह से एक
म्यूटेक्स

आपके द्वारा साझा किए गए उस अध्याय की पुस्तक का नाम क्या है? कृपया
बजे उमर फ़ारूक़ अनिक

@OmarFaroqueAnik द्वारा संदर्भित पुस्तक कोडेक्सॉररी एलएलसी द्वारा उन्नत लिनक्स प्रोग्रामिंग है, जिसे न्यू राइडर्स पब्लिशिंग द्वारा प्रकाशित किया गया है और इसे लिंक किए गए डोमेन के होम पेज से एक्सेस किया जा सकता है।
आरमार्ट

11

म्यूटेक्स उन स्थितियों में उपयोगी होता है, जहां आपको कई प्रक्रियाओं के पार एक संसाधन तक विशेष पहुंच को लागू करने की आवश्यकता होती है, जहां एक नियमित लॉक मदद नहीं करेगा क्योंकि यह केवल थ्रेड्स पर काम करता है।


क्या यह सच है? अलग-अलग प्रक्रियाएं अपनी म्यूटेक्स कॉपी नहीं बनाती हैं?
लियोन

0

म्यूटेक्स: म्यूटक्स का मतलब म्यूचुअल ual एक्स है क्ल्यूज़न है। इसका मतलब है कि एक समय में एक प्रक्रिया / धागा महत्वपूर्ण खंड में प्रवेश कर सकता है। समवर्ती प्रोग्रामिंग में जहां कई थ्रेड्स / प्रक्रिया साझा संसाधन (किसी भी चर, साझा मेमोरी आदि) को अपडेट करने की कोशिश करती है, कुछ अप्रत्याशित परिणाम ला सकती है। (जैसा कि परिणाम इस बात पर निर्भर करता है कि किस थ्रेड / प्रक्रिया को पहली एक्सेस मिलती है)।

इस तरह के अप्रत्याशित परिणाम से बचने के लिए हमें कुछ तुल्यकालन तंत्र की आवश्यकता होती है, जो यह सुनिश्चित करता है कि एक समय में केवल एक धागा / प्रक्रिया को ऐसे संसाधन तक पहुंच प्राप्त हो।

Pthread पुस्तकालय म्यूटेक्स के लिए समर्थन प्रदान करता है।

typedef union
{
  struct __pthread_mutex_s
  {
    ***int __lock;***
    unsigned int __count;
    int __owner;
#ifdef __x86_64__
    unsigned int __nusers;
#endif
 int __kind;
#ifdef __x86_64__
    short __spins;
    short __elision;
    __pthread_list_t __list;
# define __PTHREAD_MUTEX_HAVE_PREV      1
# define __PTHREAD_SPINS             0, 0
#else
    unsigned int __nusers;
    __extension__ union
    {
      struct
      {
        short __espins;
        short __elision;
# define __spins __elision_data.__espins
# define __elision __elision_data.__elision
# define __PTHREAD_SPINS         { 0, 0 }
      } __elision_data;
      __pthread_slist_t __list;
    };
#endif

यह म्यूटेक्स डेटा प्रकार यानी pthread_mutex_t के लिए संरचना है। जब म्यूटेक्स लॉक हो जाता है, तो __lock सेट 1. जब यह अनलॉक हो जाता है तो __lock 0 से सेट होता है।

यह सुनिश्चित करता है कि कोई भी दो प्रक्रिया / सूत्र एक ही समय में महत्वपूर्ण अनुभाग तक नहीं पहुँच सकते।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.