2013-01-14 20 views
16

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

प्रति प्रलेखन (और मेरे अनुभव), यह पाठकों (अर्थात जब पाठकों और लेखकों ऊपर पंक्तिबद्ध कर रहे हैं, लेखकों वरीयता मिल जाएगा) से अधिक लेखकों के पक्ष में है। हालांकि, मुझे पाठकों के पक्ष में एक समकक्ष की आवश्यकता है। मैं इस तरह के घटक के दुष्प्रभावों को समझता हूं (विशेष रूप से, लेखक भुखमरी समस्या)।

वहाँ है कि किसी को इंगित कर सकते हैं किसी भी उत्पादन के लिए तैयार समकक्ष? धन्यवाद।

+3

कोड की अनुपस्थिति कभी भी सिद्ध नहीं हो सकती है। लेकिन नहीं, यह काफी संभावना नहीं है। खरीदारी प्रश्न पूछने से बचें। –

+0

यदि आप पढ़ना चाहते हैं, तो आप आंतरिक सूची को एक अद्यतन क्लोन के साथ क्यों नहीं बदलते? आपका कोड लॉक हो जाएगा लेकिन अपडेट पर थोड़ा भारी होगा। – jgauffin

+1

हाँ, ऐसा लगता है कि आप इसे या तो कॉपी के साथ हल कर सकते हैं क्योंकि jgauffin सुझाता है, या यदि डेटा संरचना एक सस्ती प्रतिलिपि के लिए बहुत बड़ी है, तो लिखने वाले बफर के साथ लिखते हैं, इसलिए अक्सर कम होते हैं। फिर आप बफर की फ्लश करने के लिए समय को ऊपर और नीचे रैकेट करके पढ़ने/लिखने की शेष राशि को ट्विक कर सकते हैं। –

उत्तर

6

MSDN के अनुसार, ReaderWriterLockSlim लेखकों के पक्ष में है। इसका मतलब यह है कि जब कतार में पाठक और लेखक होते हैं, तो लेखकों को प्राथमिकता मिल जाएगी।

यह पुन: पेश करने के लिए इस here है पाठक भुखमरी, परीक्षण कोड उत्पादन कर सकते हैं। मुझे लगता है कि भुखमरी तभी हो सकती है जब लेखन एक लंबा ऑपरेशन हो, जिसमें थ्रेड संदर्भ स्विच शामिल हो। कम से कम यह हमेशा मेरी मशीन पर पुन: उत्पन्न होता है, इसलिए कृपया मुझे बताएं कि क्या मैं गलत हूं।

दूसरी ओर, ReaderWriterLock .net 2.0 से न पाठक और न ही लेखक भुखमरी का उत्पादन नहीं करता, कम प्रदर्शन की कीमत पर। Here पिछले नमूने से संशोधित कोड है, यह दिखाने के लिए कि कोई भुखमरी नहीं हो रही है।

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

इसके अलावा आप विकी आलेख से कोड को first readers-writers problem का वर्णन कर सकते हैं, लेकिन निश्चित रूप से आपको मैन्युअल रूप से सभी आवश्यक सुविधाओं को लागू करने की आवश्यकता होगी, और कार्यान्वयन में लेखक-भुखमरी समस्या होगी।

लॉक कोर शायद इस तरह दिख सकता:

class AutoDispose : IDisposable 
{ 
    Action _action; 
    public AutoDispose(Action action) 
    { 
    _action = action; 
    } 
    public void Dispose() 
    { 
    _action(); 
    } 
} 

class Lock 
{ 
    SemaphoreSlim wrt = new SemaphoreSlim(1); 
    int readcount=0; 

    public IDisposable WriteLock() 
    { 
    wrt.Wait(); 
    return new AutoDispose(() => wrt.Release()); 
    } 

    public IDisposable ReadLock() 
    { 
    if (Interlocked.Increment(ref readcount) == 1) 
     wrt.Wait(); 

    return new AutoDispose(() => 
    { 
     if (Interlocked.Decrement(ref readcount) == 0) 
     wrt.Release(); 
    }); 
    } 
} 

3 कार्यान्वयन के प्रदर्शन की तुलना, 3 पाठक और 3 लेखक धागे का उपयोग कर, सरल का उपयोग करने में स्मृति संचालन (लंबी अवरुद्ध आपरेशन प्रयोग करने के लिए पाठक-भुखमरी का उत्पादन होगा RWLockSlim और कस्टम ताला के लिए लेखक-भुखमरी):

Performance comparison

मुझे यकीन है कि काम का बोझ पाश संकलक द्वारा unrolled नहीं है, लेकिन वहाँ अन्य नुकसान मैं के बारे में पता नहीं कर रहा हूँ, इसलिए टी हो सकता है नमक के अनाज के साथ इन मापों को ake। परीक्षण के लिए स्रोत कोड here है।

+0

महान और बहुत विस्तृत उत्तर! बहुत सराहना की - मैं एक नज़र डालेगा। –