2010-08-19 27 views
60

Yalnızca söz konusu anahtar için bir değer içermiyorsa ya da başka bir iş parçacığı bir şeyler eklediğinde/güncellediğinde iş parçacığı yarış koşullarından dolayı false döndürürse yalnızca yanlıştır mı? kodundaConcurrentDictionary TryRemove, false değerini döndürürse

Soru:

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); 

Düzenleme: Ben verilen anahtar için bir değer içerir, ancak kesinlikle emin olmak istemiyorsa, sadece return false olacağını düşünüyorum.

cevap

63

bir ConcurrentDictionary yarış koşullarına karşı savunmasız değildir Mitch is right, ben soruyorsun soruya cevap anahtarı varsa evet, TryRemove çalışacak ve true döneceğini düşünüyorum.

Gönderdiğiniz kodda, cd, TryRemove'un false dönmesine yol açmanın, başka hiçbir yerde erişilemeyen yerel bir değişken olduğunu unutmayın. Ancak, başka bir kod, bu ConcurrentDictionary nesnesine bir başvuru verildi ve ayrı bir iş parçacığı üzerinde anahtarlarını kaldırıyorduysa, TryRemove, false, hatta , yalnızca anahtar zaten kaldırıldı, başka bir nedenle, çünkü kaldırıldı olabilir eylem sözlükte gerçekleştiriliyor ve anahtar bir şekilde "sıkışmış".

5

ConcurrentDictionary, yarış koşullarından etkilenmez. Bu yüzden onu kullanıyorsun.

Dönüş Değeri

gerçek bir nesne başarıyla kaldırılması durumunda; aksi halde, yanlış.

1

Bir diğer nokta yapmak:

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

Bu yorum, yanlış ve muhtemelen o denemek 'için ne anlama geldiğini aynı yanılgıya muzdarip. Eklemek için eşzamanlı bir denemeyle ilgili değil, daha önce 1 numaralı anahtarla bir değerin eklenip eklenmediği.

Standart bir Dictionary<TKey,TValue> düşünün. Eşdeğer kod şu şekilde olur: İki işlem gerektirir. cd, Contains ve Add çağrıları arasına eklenen anahtar ile cd arasında bir değere sahip olabileceğinden, bu tür bir API'yi tasarım için kullanmanın bir yolu yoktur, bu da Add atımına neden olur. Eşzamanlı koleksiyonlarda, bu test-and-do çiftlerini mantıksal olarak tek bir API'nin arkasındaki tek atomik işlemlere ayıran API'ler vardır.

İlgili konular