ऐसे मामलों में जहां बहुत अधिक पढ़े जाते हैं लिखते हैं, या (हालांकि अक्सर) लिखते हैं गैर-समवर्ती , एक कॉपी-ऑन-राइट दृष्टिकोण उपयुक्त हो सकता है।
नीचे दिखाया गया कार्यान्वयन है
- लॉकसेल
- समवर्ती पाठ के लिए धधकते हुए तेज , भले ही समवर्ती संशोधन चल रहे हों - चाहे वे कितना भी समय लें
- क्योंकि "स्नैपशॉट" अपरिवर्तनीय हैं, लॉकलेस एटमॉसिटी संभव है, अर्थात
var snap = _list; snap[snap.Count - 1];
कभी नहीं (अच्छी तरह से, पाठ्यक्रम की एक खाली सूची को छोड़कर) फेंक देंगे, और आपको थ्रेड-सेफ एन्यूमरेशन भी मुफ्त में स्नैपशॉट शब्दार्थ के साथ मिलता है .. कैसे LOVE अपरिवर्तनीयता!
- किसी भी डेटा संरचना के लिए लागू उदारतापूर्वक , और किसी भी प्रकार के संशोधन पर
- मृत सरल , यानी कोड को पढ़कर परीक्षण करना, डीबग करना आसान है
- प्रयोग करने योग्य .Net 3.5 में
काम पर लिखने के लिए, आपको अपनी डेटा संरचनाओं को प्रभावी रूप से अपरिवर्तनीय रखना होगा , अर्थात आपके द्वारा उन्हें अन्य थ्रेड उपलब्ध कराने के बाद किसी को भी उन्हें बदलने की अनुमति नहीं है। जब आप संशोधित करना चाहते हैं, तो आप
- संरचना को क्लोन करें
- क्लोन पर संशोधन करें
- संशोधित क्लोन के संदर्भ में परमाणु स्वैप
कोड
static class CopyOnWriteSwapper
{
public static void Swap<T>(ref T obj, Func<T, T> cloner, Action<T> op)
where T : class
{
while (true)
{
var objBefore = Volatile.Read(ref obj);
var newObj = cloner(objBefore);
op(newObj);
if (Interlocked.CompareExchange(ref obj, newObj, objBefore) == objBefore)
return;
}
}
}
प्रयोग
CopyOnWriteSwapper.Swap(ref _myList,
orig => new List<string>(orig),
clone => clone.Add("asdf"));
यदि आपको अधिक प्रदर्शन की आवश्यकता है, तो यह विधि को ungenerify करने में मदद करेगा, जैसे कि हर प्रकार के संशोधन के लिए एक विधि बनाएं (Add, Remove, ...) जो आप चाहते हैं, और फ़ंक्शन कोड को हार्ड कोड cloner
और op
।
एनबी # 1 यह आपकी ज़िम्मेदारी है कि कोई भी (कथित रूप से) अपरिवर्तनीय डेटा संरचना को संशोधित न करे। इसे रोकने के लिए जेनेरिक कार्यान्वयन में हम कुछ नहीं कर सकते हैं , लेकिन जब विशेषज्ञता होती है List<T>
, तो आप List.AsReadOnly () का उपयोग करके संशोधन के खिलाफ रख सकते हैं
एनबी # 2 सूची में मूल्यों के बारे में सावधान रहें। केवल उपर उनकी सूची सदस्यता के लिए लिखने के दृष्टिकोण पर प्रतिलिपि, लेकिन अगर आप तार नहीं डालेंगे, लेकिन वहाँ कुछ अन्य परिवर्तनशील वस्तुओं, आपको थ्रेड सुरक्षा (जैसे लॉकिंग) का ध्यान रखना होगा। लेकिन इस समाधान के लिए यह ओर्थोगोनल है और उदाहरण के लिए उत्परिवर्तित मानों को लॉक करना मुद्दों के बिना आसानी से उपयोग किया जा सकता है। आपको बस इसके बारे में पता होना चाहिए।
NB # 3 यदि आपकी डेटा संरचना बहुत बड़ी है और आप इसे बार-बार संशोधित करते हैं, तो कॉपी-ऑल-ऑन-राइट अप्रोच मेमोरी खपत और सीपीयू की लागत दोनों के लिए निषेधात्मक हो सकती है। उस स्थिति में, आप इसके बजाय MS के अपरिवर्तनीय संग्रह का उपयोग करना चाह सकते हैं ।