क्या कोई इसके बीच का अंतर समझा सकता है:
- ताला (कोई बात) {}
- म्यूटेक्स का उपयोग करना
- सेमाफोर का उपयोग करना
- मॉनिटर का उपयोग करना
- अन्य .Net तुल्यकालन वर्गों का उपयोग करना
मैं अभी इसका पता नहीं लगा सकता। ऐसा लगता है कि पहले दो समान हैं?
क्या कोई इसके बीच का अंतर समझा सकता है:
मैं अभी इसका पता नहीं लगा सकता। ऐसा लगता है कि पहले दो समान हैं?
जवाबों:
बड़ा सवाल है। मैं शायद गलत हूं .. मुझे कोशिश करें .. मेरे मूल उत्तर का # संशोधन 2 .. थोड़ा और अधिक समझ के साथ। मुझे पढ़ने के लिए धन्यवाद :)
ताला (obj)
पर नज़र रखता है
कोड के थ्रेड-सेंसिटिव ब्लॉक्स के एक साथ निष्पादन को रोकने के लिए एक लॉक या मॉनिटर का उपयोग करना उपयोगी होता है, लेकिन ये निर्माण एक थ्रेड को दूसरे ईवेंट को संवाद करने की अनुमति नहीं देते हैं। इसके लिए सिंक्रोनाइज़ेशन ईवेंट की आवश्यकता होती है , जो कि दो स्टेट्स में से एक है, जो सिग्नल और अन-सिग्नलेड हैं, जिसका उपयोग थ्रेड को सक्रिय करने और निलंबित करने के लिए किया जा सकता है। म्यूटेक्स, सेमफोरस ओएस-स्तर की अवधारणाएं हैं। उदाहरण के लिए एक नामित म्यूटेक्स के साथ आप कई (प्रबंधित) एक्सिस (यह सुनिश्चित कर सकते हैं कि आपके एप्लिकेशन का केवल एक उदाहरण मशीन पर चल रहा है) को सिंक्रनाइज़ कर सकता है।)
म्युटेक्स:
सेमाफोरस (मेरे मस्तिष्क को चोट)।
Monitor
संचार की अनुमति नहीं देना गलत है; आप कर सकते हैं अभी भी Pulse
आदि एक साथMonitor
"अन्य .Net तुल्यकालन वर्गों का उपयोग करना" - कुछ अन्य जिनके बारे में आपको पता होना चाहिए:
CCR / TPL ( समानांतर एक्सटेंशन CTP) में अधिक (कम ओवरहेड) लॉकिंग निर्माण भी हैं - लेकिन IIRC, इन्हें .NET 4.0 में उपलब्ध कराया जाएगा।
जैसा कि ईसीएमए में कहा गया है, और जैसा कि आप प्रतिबिंबित तरीकों से देख सकते हैं कि लॉक स्टेटमेंट मूल रूप से इसके बराबर है
object obj = x;
System.Threading.Monitor.Enter(obj);
try {
…
}
finally {
System.Threading.Monitor.Exit(obj);
}
उपरोक्त उदाहरण से हम देखते हैं कि मॉनिटर्स वस्तुओं पर ताला लगा सकते हैं।
जब आप एक स्ट्रिंग पहचानकर्ता पर ताला लगा सकते हैं, तो आपको म्यूटेक्स के इंटरप्रोसेस सिंक्रनाइज़ेशन की आवश्यकता होती है । लॉक को प्राप्त करने के लिए एक ही स्ट्रिंग पहचानकर्ता का उपयोग विभिन्न प्रक्रियाओं द्वारा किया जा सकता है।
सेराफोर स्टेरॉयड पर म्यूटेक्स की तरह हैं, वे समवर्ती पहुंच की अधिकतम गिनती प्रदान करके समवर्ती पहुंच की अनुमति देते हैं '। एक बार जब सीमा समाप्त हो जाती है तो सेमीफोर रिसोर्स तक किसी और एक्सेस को ब्लॉक करना शुरू कर देता है जब तक कि कॉलर का एक सेमाफोर रिलीज नहीं होता।
मैंने DotGNU में थ्रेडिंग के लिए क्लासेस और CLR सपोर्ट किया और मेरे कुछ विचार हैं ...
जब तक आपको क्रॉस प्रक्रिया ताले की आवश्यकता नहीं होती है तब तक आपको म्यूटेक्स और सेमाफोरेस का उपयोग करने से हमेशा बचना चाहिए। .NET में ये कक्षाएं Win32 Mutex और Semaphores के आसपास रैपर हैं और बल्कि भारी हैं (उन्हें कर्नेल में एक संदर्भ स्विच की आवश्यकता होती है जो महंगा है - खासकर यदि आपका लॉक विवाद के अधीन नहीं है)।
जैसा कि अन्य लोगों ने उल्लेख किया है, C # लॉक स्टेटमेंट मॉनिटर.इंटर और मॉनिटर के लिए कंपाइलर मैजिक है। एक्ज़िट (कोशिश या अंत में मौजूद)।
मॉनिटर्स में एक सरल लेकिन शक्तिशाली सिग्नल / प्रतीक्षा तंत्र होता है, जो म्यूटेक्स के पास मॉनीटर नहीं है। Win32 समतुल्य ईवेंट ऑब्जेक्ट CreateEvent के माध्यम से होगा जो वास्तव में .NET में WaitHandles के रूप में भी मौजूद है। पल्स / वेट मॉडल, यूनिक्स के pthread_signal और pthread_wait के समान है, लेकिन तेज़ हैं क्योंकि वे पूरी तरह से अन-कंटेस्टेड केस में यूजर-मोड ऑपरेशन हो सकते हैं।
Monitor.Pulse / Wait का उपयोग करना सरल है। एक थ्रेड में, हम एक ऑब्जेक्ट को लॉक करते हैं, एक ध्वज / राज्य / संपत्ति की जांच करते हैं और अगर यह वह नहीं है जो हम उम्मीद कर रहे हैं, तो मॉनिटर को कॉल करें। जो लॉक को रिलीज़ करेगा और एक पल्स भेजे जाने तक प्रतीक्षा करेगा। जब प्रतीक्षा वापस आती है, तो हम वापस लूप करते हैं और ध्वज / राज्य / संपत्ति को फिर से जांचते हैं। दूसरे धागे में, जब भी हम झंडा / राज्य / संपत्ति बदलते हैं, तब हम ऑब्जेक्ट को लॉक करते हैं और फिर किसी भी सुनने वाले धागे को जगाने के लिए PulseAll को कॉल करते हैं।
अक्सर हम चाहते हैं कि हमारी कक्षाएं सुरक्षित रहें, इसलिए हम अपने कोड में ताले लगाते हैं। हालांकि, यह अक्सर ऐसा होता है कि हमारी कक्षा केवल एक धागे द्वारा कभी भी उपयोग की जाएगी। इसका मतलब यह है कि ताले अनावश्यक रूप से हमारे कोड को धीमा कर देते हैं ... यह वह जगह है जहां सीएलआर में चतुर अनुकूलन प्रदर्शन को बेहतर बनाने में मदद कर सकता है।
मुझे Microsoft के ताले के कार्यान्वयन के बारे में निश्चित नहीं है, लेकिन DotGNU और मोनो में, हर वस्तु के हेडर में एक लॉक स्टेट फ्लैग संग्रहीत है। .NET (और जावा) की प्रत्येक वस्तु एक ताला बन सकती है, इसलिए प्रत्येक वस्तु को अपने हेडर में इसका समर्थन करने की आवश्यकता होती है। DotGNU कार्यान्वयन में, एक झंडा होता है जो आपको हर वस्तु के लिए एक वैश्विक हैशटेबल का उपयोग करने की अनुमति देता है जिसे लॉक के रूप में उपयोग किया जाता है - इससे हर वस्तु के लिए 4 बाइट ओवरहेड को खत्म करने का लाभ होता है। यह मेमोरी के लिए महान नहीं है (विशेष रूप से एम्बेडेड सिस्टम के लिए जो भारी रूप से थ्रेडेड नहीं हैं) लेकिन प्रदर्शन पर हिट है।
मोनो और DotGNU दोनों प्रभावी रूप से लॉकिंग / वेटिंग करने के लिए म्यूटेक्स का उपयोग करते हैं, लेकिन वास्तव में आवश्यक होने तक हार्ड लॉक करने की आवश्यकता को समाप्त करने के लिए एक स्पिनलॉक शैली की तुलना और एक्सचेंज संचालन का उपयोग करते हैं:
आप इसका एक उदाहरण देख सकते हैं कि कैसे मॉनिटर को यहां लागू किया जा सकता है:
http://cvs.savannah.gnu.org/viewvc/dotgnu-pnet/pnet/engine/lib_monitor.c?revision=1.7&view=markup
एक स्ट्रिंग आईडी के साथ पहचाने गए किसी भी साझा म्यूटेक्स पर ताला लगाने के लिए एक अतिरिक्त चेतावनी यह है कि यह एक "स्थानीय \" म्यूटेक्स के लिए डिफ़ॉल्ट होगा और टर्मिनल सर्वर वातावरण में सत्र भर में साझा नहीं किया जाएगा।
"ग्लोबल \" के साथ अपने स्ट्रिंग आइडेंटिफ़ायर को सुनिश्चित करें कि साझा सिस्टम संसाधनों तक पहुंच ठीक से नियंत्रित हो। इससे पहले कि मुझे यह एहसास होता कि मैं सिस्टम खाते के तहत चल रही एक सेवा के साथ संचार को सिंक्रनाइज़ करने में समस्याओं का एक पूरा ढेर में चल रहा था।
मैं "ताला ()", "म्यूटेक्स" और "मॉनिटर" से बचने की कोशिश करूंगा यदि आप कर सकते हैं ...
नए नामस्थान सिस्टम की जाँच करें। पॉलिसियन। .NET 4 में समवर्ती।
इसमें कुछ अच्छे थ्रेड-सुरक्षित संग्रह वर्ग हैं।
http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx
समवर्ती चट्टानों! अब मेरे लिए कोई मैनुअल लॉकिंग नहीं है!
ज्यादातर मामलों में आपको ताले (= मॉनिटर्स) या म्यूटेक्स / सेमाफोर का उपयोग नहीं करना चाहिए । वे सभी वर्तमान थ्रेड को ब्लॉक करते हैं।
और आपको निश्चित रूप से कक्षाओं का उपयोग नहीं करना चाहिए System.Collections.Concurrent
- वे दौड़ की स्थिति का मुख्य स्रोत हैं क्योंकि कई संग्रह के बीच लेनदेन का समर्थन नहीं करते हैं, और वर्तमान थ्रेड को भी ब्लॉक करते हैं।
आश्चर्यजनक रूप से .NET में सिंक्रनाइज़ेशन के लिए प्रभावी तंत्र नहीं है।
मैंने सी # पर जीसीडी ( दुनिया) से सीरियल कतार लागू की Objc/Swift
- बहुत हल्के, न कि सिंक्रनाइज़ेशन टूल जो थ्रेड पूल का उपयोग करता है, परीक्षणों के साथ।
यह ज्यादातर मामलों में कुछ भी सिंक्रनाइज़ करने का सबसे अच्छा तरीका है - डेटाबेस एक्सेस (हेलो साइक्लाइट) से लेकर बिजनेस लॉजिक तक।