2008-11-13 14 views
5

मैंने .NET 2.0 में रीडरवाइटर लॉक और .NET 3.5 में रीडरवाइटर लॉकस्लिम को देखा है, और स्लिम संस्करण लॉकिंग के लिए कर्नेल ऑब्जेक्ट्स का उपयोग नहीं करता है। मेरे संदर्भ के लिए, जो संभावित रूप से बड़ी मात्रा में वस्तुएं उत्पन्न कर सकता है (लेकिन बड़ी नहीं) वस्तुओं की मात्रा, यह बेहतर लगता है।क्या .NET 2.0 के लिए एक पतला पाठक/लेखक लॉक है?

लेकिन मेरे द्वारा लिखे जाने वाले कोड को संक्रमण अवधि के दौरान .NET 2.0 और 3.5 दोनों में उपयोग करने की आवश्यकता है, इसलिए 3.5 संस्करण, मेरे उद्देश्यों के लिए अच्छा लग रहा है, का उपयोग नहीं किया जा सकता है।

क्या किसी के पास एक समान वर्ग है, जिसे मैं .NET 2.0 में प्लग कर सकता हूं और इसके साथ कुछ लाभ प्राप्त कर सकता हूं?

उत्तर

5

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

क्या आपके पास यह सुझाव देने के लिए कोई ठोस उपाय है कि ReaderWriterLockSlim का उपयोग होगा बहुत बेहतर है कि .NET 2.0 के विकल्पों के लिए कठिन लग रहा है? यह निश्चित रूप से "अच्छा होना" है लेकिन मुझे उन मामलों पर संदेह है जहां यह बड़े पैमाने पर महत्वपूर्ण अपेक्षाकृत दुर्लभ हैं। जब तक कि आप पहले से ही नहीं जानते कि लॉकिंग आपके लिए एक बाधा है, मैं जो कुछ मिला है उसके साथ रहूंगा और जब आप कर सकते हैं तो अपग्रेड करने के लिए तैयार रहें।

हालांकि आप ReaderWriterLock के बजाय सामान्य मॉनीटर का उपयोग करने की कोशिश करना चाहेंगे हालांकि - कई मामलों में आरडब्ल्यूएल का ओवरहेड लाभ से अधिक है।

बेशक

, यह सब एक मामला-दर-मामला आधार पर है - अपने ऐप्लिकेशन एक है जो वास्तव में बहुत से किया जाएगा, बहुत ReaderWriterLockSlim द्वारा तेजी से हो सकता है ...

+0

मेरा डेटा संरचनाएं एक सेवा-कंटेनर आईओसी प्रकार की चीज़ के लिए हैं, और उनके पास डेटा संरचनाएं होंगी, जो प्रारंभ के दौरान ज्यादातर एक धागे पर लिखती हैं, लेकिन उसके बाद ज्यादातर धागे पर पढ़ती हैं, इसलिए मैं कर्नेल ऑब्जेक्ट्स से बचने और बस लॉक() ... –

+0

मैं लॉकिंग कोड को अपनी कक्षा में अलग कर दूंगा और इसका उपयोग करूँगा, और अभी के लिए विशेष लॉक का उपयोग करें, फिर मैं हमेशा बाद में बेहतर लॉक प्लग कर सकता हूं यह आवश्यक हो जाता है –

+0

यह जाने का सही तरीका लगता है, हाँ। –

0

क्या ReaderWriterGatePowerThreading पुस्तकालय से के बारे में?

+1

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

1

No hard lock ReadWriteLocker - यह कक्षा रीडरवाइटर लॉक वैकल्पिक से डिज़ाइन की गई है, जो रीडरवाइटर लॉक से 20% -30% तेज है।

मतभेद है कि मैं बना दिया है:

  1. का समर्थन करता है के अंदर नेस्टिंग लिखने ताले के माध्यम से ताले उन्नयन ताले पढ़ें। रीडरवाइटर लॉक के विपरीत, ताले अपग्रेड थ्रेड सुरक्षित हैं।
  2. उदाहरण संग्रह है जो आपको दिखाता है कि थ्रेड सुरक्षित संग्रह कैसे डिज़ाइन करें। वे .NET 4.0 के पीएफएक्स संग्रह के रूप में उतने कुशल नहीं हैं, लेकिन उनके पास अन्य लाभ भी हैं।
  3. यदि सभी लॉक शुरू किए गए हैं तो अनलॉक नहीं किया जा सकता है। और अन्य सभी लॉकिंग तंत्र इस लॉकर के लिए पारस्परिक रूप से अनन्य चलाते हैं।
  4. डेडलॉक्स का पता लगाने और डेडलॉक पहचान ओवरहेड को बंद करने की क्षमता एक बार जब आप डेडलॉक्स सत्यापित करते हैं तो ऐसा नहीं होता है।
  5. रीडरवाइटर लॉक और रीडरवाइटर लॉकस्लिम की तुलना में अत्यधिक पुनरावर्ती, और कई बार अधिक मजबूत ।

मैंने इस पर बहुत सारे काम किए हैं, और मुझे उम्मीद है कि यह उपयोगी होगा। यह अभी तक बहुत नया है, और अन्य लॉकिंग तंत्र के संबंध में परीक्षण की आवश्यकता होगी। और निश्चित रूप से, सब कुछ .NET 2.0 शिकायत है।

+0

मैं इसे निश्चित रूप से देखूंगा, इसे प्रकाशित करने और मुझे इसके बारे में बताने के लिए धन्यवाद। –

0

मैंने ReaderWriterLock का उपयोग करने के डाउनसाइड्स के बारे में एक प्रश्न पूछा है और ReaderWriterLock के विकल्प वाले कुछ रोचक लिंक हैं। answer to my question पर एक नज़र डालें।

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