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 और कस्टम ताला के लिए लेखक-भुखमरी):
मुझे यकीन है कि काम का बोझ पाश संकलक द्वारा unrolled नहीं है, लेकिन वहाँ अन्य नुकसान मैं के बारे में पता नहीं कर रहा हूँ, इसलिए टी हो सकता है नमक के अनाज के साथ इन मापों को ake। परीक्षण के लिए स्रोत कोड here है।
कोड की अनुपस्थिति कभी भी सिद्ध नहीं हो सकती है। लेकिन नहीं, यह काफी संभावना नहीं है। खरीदारी प्रश्न पूछने से बचें। –
यदि आप पढ़ना चाहते हैं, तो आप आंतरिक सूची को एक अद्यतन क्लोन के साथ क्यों नहीं बदलते? आपका कोड लॉक हो जाएगा लेकिन अपडेट पर थोड़ा भारी होगा। – jgauffin
हाँ, ऐसा लगता है कि आप इसे या तो कॉपी के साथ हल कर सकते हैं क्योंकि jgauffin सुझाता है, या यदि डेटा संरचना एक सस्ती प्रतिलिपि के लिए बहुत बड़ी है, तो लिखने वाले बफर के साथ लिखते हैं, इसलिए अक्सर कम होते हैं। फिर आप बफर की फ्लश करने के लिए समय को ऊपर और नीचे रैकेट करके पढ़ने/लिखने की शेष राशि को ट्विक कर सकते हैं। –