2012-07-17 30 views
6

बाइनरी सेमाफोर और म्युटेक्स के बारे में पढ़ते समय मैं निम्नलिखित अंतर नहीं पाया:म्यूटेक्स उपलब्ध होने पर बाइनरी सेमफोर का उपयोग कहां करें?

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

तो मुझे बाइनरी सेमफोर का उपयोग कहां करना चाहिए? क्या कोई एक उदाहरण उद्धृत कर सकता है?

संपादित करें: मुझे लगता है कि मैंने दोनों के काम को समझ लिया है। असल में बाइनरी सेमफोर सिंक्रनाइज़ेशन प्रदान करते हैं जबकि म्यूटेक्स ऑफ़र लॉकिंग तंत्र। मैंने इसे और अधिक स्पष्ट करने के लिए गैल्विन ओएस पुस्तक से कुछ उदाहरण पढ़े।

उत्तर

5

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

1

बाइनरी म्यूटेक्स के बजाय गिनती सेमफोर का उपयोग करने के लिए कैननिकल उदाहरण तब होता है जब आपके पास सीमित संसाधन उपलब्ध होते हैं जो एक हैं) अदला-बदली और बी) एक से अधिक।

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

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

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

+3

ओपी बाइनरी सेमफोर बनाम (हमेशा-बाइनरी) म्यूटेक्स के बारे में पूछ रहा था, म्यूटेक्स बनाम सेमफोर की गणना नहीं की गई। –

3

लगभग सभी मामलों में मैं लॉकिंग के बिना अन्य धागे को सिग्नल करने के लिए बाइनरी सेमफोर का उपयोग करता हूं।

तुल्यकालिक अनुरोध के लिए उपयोग के सरल उदाहरण:

थ्रेड 1:

Semaphore sem; 
request_to_thread2(&sem); // Function sending request to thread2 in any fashion 
sem.wait();    // Waiting request complete 

थ्रेड 2:

Semaphore *sem; 
process_request(sem);  // Process request from thread 1 
sem->post();    // Signal thread 1 that request is completed 

ध्यान दें: आप सूत्र में पोस्ट सेमाफोर से पहले 2 प्रसंस्करण आप बिना किसी अतिरिक्त सिंक्रनाइज़ेशन के थ्रेड 1 डेटा को सुरक्षित रूप से सेट कर सकते हैं।