जब समवर्ती छाया TryRemove गलत वापस आ जाएगा


79

क्या यह केवल गलत है जब डिक्शनरी में दिए गए कुंजी के लिए मान नहीं होगा या क्या यह थ्रेड रेस की स्थिति के कारण भी गलत होगा, जैसे कि एक और थ्रेड कुछ जोड़ता / अपडेट करता है?

कोड में प्रश्न:

ConcurrentDictionary<int, string> cd = new ConcurrentDictionary<int, string>();

// This might fail if another thread is adding with key value of 1.
cd.TryAdd(1, "one"); 

// Will this ever fail if no other thread ever removes with the key value of 1?
cd.TryRemove(1); 

संपादित करें: मुझे लगता है कि यह केवल तभी गलत होगा जब इसमें दिए गए कुंजी के लिए मान नहीं होगा, लेकिन पूरी तरह से सुनिश्चित होना चाहते हैं।

जवाबों:


85

जबकि मिच सही है कि ConcurrentDictionaryदौड़ की स्थिति के लिए कमजोर नहीं है, मुझे लगता है कि आप जो सवाल पूछ रहे हैं उसका जवाब यह है कि हां, यदि कुंजी मौजूद है, TryRemoveतो काम करेगा और वापस आ जाएगा true

आपके द्वारा पोस्ट किए गए कोड में, ऐसा कोई तरीका नहीं है जो TryRemoveतब से वापस आ जाएगा falseजब तक कि cdस्थानीय चर कहीं और न पहुंच जाए। लेकिन अगर कुछ कोड कहीं ConcurrentDictionaryऔर इस ऑब्जेक्ट का संदर्भ दिए गए थे और एक अलग थ्रेड पर चाबियाँ निकाल रहे थे, तो यह संभव है कि यहां तक कि TryRemoveवापस आ सकता falseहै - लेकिन केवल इसलिए कि कुंजी पहले ही हटा दी गई थी , इसलिए नहीं कि कुछ अन्य कार्रवाई की जा रही है शब्दकोश और कुंजी किसी तरह वहाँ "अटक" है।


5

ConcurrentDictionary दौड़ की स्थिति से ग्रस्त नहीं है। इसलिए आप इसका उपयोग करें।

प्रतिलाभ की मात्रा

सच है अगर किसी वस्तु को सफलतापूर्वक हटा दिया गया था; अन्यथा, गलत है।


2

एक अन्य बिंदु बनाने के लिए:

// This might fail if another thread is adding with key value of 1.
cd.TryAdd(1, "one"); 

यह टिप्पणी गलत है और संभवतः उसी गलतफहमी से ग्रस्त है कि इसका 'प्रयास' करने का क्या मतलब है। यह जोड़ने के लिए एक समवर्ती प्रयास के बारे में नहीं है, यह है कि क्या पहले से ही कुंजी के साथ एक मूल्य जोड़ा गया है 1

एक मानक पर विचार करें Dictionary<TKey,TValue>। समतुल्य कोड होगा:

if (!d.Contains(1))
    d.Add(1, "one");

इसके लिए दो ऑपरेशन की जरूरत है। इस तरह के एपीआई को थ्रेडसेफ़ डिज़ाइन करने का कोई तरीका नहीं है, क्योंकि कॉल के बीच cdकुंजी के साथ एक मूल्य हो सकता है और , जिसके परिणामस्वरूप फेंक दिया जाएगा।1ContainsAddAdd

समवर्ती संग्रह में एपीआई होते हैं जो तार्किक रूप से इन परीक्षण-और-जोड़े जोड़े को एकल एपीआई के पीछे एकल परमाणु संचालन में बंडल करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.