मैं एक पोर्टेबल क्लास लाइब्रेरी लिख रहा हूं जो .NET 4.5, विंडोज स्टोर ऐप और विंडोज फोन 8 को लक्षित करता है। मुझे एक कुशल इन-मेमोरी कैश तंत्र की आवश्यकता है, इसलिए मैं ConcurrentDictionary<K,V>
का उपयोग करने के बारे में सोच रहा था, लेकिन यह WP8 में उपलब्ध नहीं है।पोर्टेबल क्लास लाइब्रेरी के लिए ConcurrentDictionary के लिए वैकल्पिक
कई पढ़े जाएंगे और अपेक्षाकृत कुछ लिखेंगे, इसलिए आदर्श रूप से मुझे एक संग्रह चाहिए जो एकाधिक धागे से लॉक-फ्री रीड का समर्थन करता है, और एक थ्रेड द्वारा लिखता है। गैर सामान्य Hashtable
है कि संपत्ति, according to MSDN है, लेकिन दुर्भाग्य से यह पीसीएल में उपलब्ध नहीं है ...
वहाँ पीसीएल कि इस आवश्यकता से मेल खाता है में एक और संग्रह वर्ग उपलब्ध है? यदि नहीं, तो पढ़ने के लिए लॉक किए बिना थ्रेड सुरक्षा प्राप्त करने का एक अच्छा तरीका क्या होगा? (राईट के लिए ताला लगा ठीक है, क्योंकि यह भी अक्सर नहीं होगा)
संपादित करें: JaredPar के मार्गदर्शन के लिए धन्यवाद, मैं अंत में अपने कैश एक पूरी तरह से ताला मुक्त फैशन में Microsoft.Bcl.Immutable से लागू किया, ImmutableDictionary<TKey, TValue>
का उपयोग कर:
class Cache<TKey, TValue>
{
private IImmutableDictionary<TKey, TValue> _cache = ImmutableDictionary.Create<TKey, TValue>();
public TValue GetOrAdd(TKey key, [NotNull] Func<TKey, TValue> valueFactory)
{
valueFactory.CheckArgumentNull("valueFactory");
TValue newValue = default(TValue);
bool newValueCreated = false;
while (true)
{
var oldCache = _cache;
TValue value;
if (oldCache.TryGetValue(key, out value))
return value;
// Value not found; create it if necessary
if (!newValueCreated)
{
newValue = valueFactory(key);
newValueCreated = true;
}
// Add the new value to the cache
var newCache = oldCache.Add(key, newValue);
if (Interlocked.CompareExchange(ref _cache, newCache, oldCache) == oldCache)
{
// Cache successfully written
return newValue;
}
// Failed to write the new cache because another thread
// already changed it; try again.
}
}
public void Clear()
{
_cache = _cache.Clear();
}
}
क्या आपने एक ऐसा प्रकार लिखने पर विचार किया है जो एक अपरिवर्तनीय पेड़ को लपेटता है, और लिखने के लिए सीएएस करता है? इससे आपको लॉक फ्री रीड, सीएएस लिखना होगा और आप एरिक के अपरिवर्तनीय एवीएल पेड़ का समर्थन बैकिंग स्ट्रक्चर के रूप में कर सकते हैं http://blogs.msdn.com/b/ericlippert/archive/2008/01/21/immutability-in- सी-भाग-नौ-अकादमिक-प्लस-मेरा-एवीएल-पेड़-कार्यान्वयन.aspx – JaredPar
@ जेरेडपायर, "सीएएस" क्या है? –
सीएएस = तुलना और स्वैप करें। – JaredPar