2010-08-23 16 views
6

मेरे लिए अब यह कार्यात्मक रूप से Semaphore.WaitOne/ReleaseMonitor.Wait/Pulse के बराबर दिखता है। इंटरप्रोसेस क्षमताओं को छोड़ना, गति (हाँ, मॉनीटर प्रबंधित है) अन्य गैर-कार्यात्मक मतभेद, फिर वास्तविक अंतर क्या है?सेमफोर। वैटोन/रिलीज बनाम मॉनिटर। पल्स/रुको

उत्तर

10

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

Monitor.Wait और Monitor.Pulse बहुत अलग हैं। सबसे पहले और सबसे महत्वपूर्ण कोई गिनती शामिल नहीं है। Pulse किसी भी कॉल की अनुपस्थिति में Wait पर कॉल किया जाता है तो सिग्नल को अनदेखा और त्याग दिया जाता है। यह उसी तरह से कतारबद्ध नहीं है जैसे एक सेमफोर होगा। वास्तव में, Wait और Pulse का व्यवहार कोई अंतर्निहित अर्थ नहीं है। Wait बस अधिग्रहण लॉक की स्थिति में बदलाव की प्रतीक्षा कर रहा है (Monitor.Enter से अधिग्रहित)। Pulse संकेत है कि कुछ बदल गया है। यही कारण है कि आप अक्सर Wait को while लूप में बुलाते हैं। प्रतीक्षा धागे को प्रतीक्षा की स्थिति को फिर से रखना चाहिए क्योंकि इसमें कोई जानकारी नहीं है कि क्या बदल गया है!

Monitor.Wait और Monitor.Pulse मौलिक सिंक्रनाइज़ेशन तंत्र हैं जिनका उपयोग सेफफोर्स समेत किसी भी अन्य सिंक्रनाइज़ेशन डिवाइस को बनाने के लिए किया जा सकता है।

+0

यह वाकई शानदार जवाब है! यह मेरे लिए चीजों को मंजूरी दे दी! – Andrey

+0

'पल्स' को सिग्नल के रूप में मानना ​​अक्सर अच्छा होता है कि कुछ "हो सकता है" बदल जाता है। आवश्यक विचार यह है कि यदि किसी विधि को कुछ फैशन में संसाधन बदलने की प्रतीक्षा की जाती है (उदाहरण के लिए इसमें कोई डेटा है), और वह परिवर्तन केवल उस कोड द्वारा किया जा सकता है जिसमें उस संसाधन पर लॉक होता है, पूर्व विधि परीक्षण कर सकता है कि परिवर्तन हुआ है और, यदि नहीं, तो लॉक पर 'Monitor.Wait' पर कॉल करें। यदि लॉक किए गए संसाधनों को बदलने वाली प्रत्येक विधि 'पल्सएल' कहती है, तो कोई भी व्यक्ति जो बदलाव की प्रतीक्षा कर रहा है, उसे जागृत कर दिया जाएगा और यह देखने का मौका दिया जाएगा कि वह किस बदलाव का इंतजार कर रहा है या नहीं। – supercat

2

मॉनिटर। वैट/पल्स आपको एक शर्त चर प्रदान करता है, जो एक सेमफोर (लेकिन बिल्कुल नहीं) की तुलना में ऑटो-रीसेट ईवेंट की तरह है। मुख्य अंतर यह है कि एक सेमफोर की गिनती होती है, जिसका मतलब है कि आपको कुछ भी लॉक करने की आवश्यकता नहीं है ताकि आप सुनिश्चित कर सकें कि आपको नाड़ी याद नहीं है (मॉनिटर.एट के विपरीत)।

संबंधित मुद्दे