SORU
22 Aralık 2009, Salı


.NET - Sözlük ConcurrentDictionary vs kilitleme

Bunu burada sormak istedim ConcurrentDictionary türleri hakkında yeterli bilgi bulamadım.

Şu anda, Dictionary Sürekli birden çok iş parçacığı (bir iş parçacığı havuzu iş parçacığı kesin bir miktar) tarafından erişilen tüm kullanıcılar tutmak için kullanıyorum, ve erişim senkronize vardır.

Geçenlerde bir iş parçacığı için güvenli koleksiyon kümesi olduğunu öğrendi .NET 4.0 ve çok hoş görünüyor. Ben de onu merak ediyordum, ne olacak 'daha verimli ve daha kolay Yönet' seçeneği olarak var seçeneği arasında olması normal Dictionary ile senkronize erişim, ya da bir ConcurrentDictionary zaten iş parçacığı için güvenli.

Reference to .NET 4.0's ConcurrentDictionary

CEVAP
27 Aralık 2009, Pazar


İş parçacığı için güvenli bir iş parçacığı için güvenli olmayan toplama vs bir koleksiyon farklı bir şekilde değerlendirilebilir.

Kasada başka hiçbir memuru ile bir mağaza düşünün. Eğer insanlar sorumluluk bilinciyle hareket yok ise sorunsuz bir ton var. Örneğin, diyelim ki bir müşteri bir katip şu anda Piramidi inşa ederken piramit-tüm cehennem gevşek kıracak bir bir can alır söylüyorlar. Ya da, eğer iki müşteri kim kazanır aynı zamanda aynı madde, ulaşırsa ne olur? Kavga olacak mı? Bu olmayan iş parçacığı için güvenli bir toplama. Sorunları önlemek için bir sürü yol var, ama hepsi bir şekilde kilitleme, ya da daha doğrusu açık erişim ya da başka bir tür gerektirir.

Öte yandan, masa başında bir memur ile bir mağaza düşünün, ve sadece onun aracılığıyla alışveriş yapabilirsiniz. Siz sıraya, ve bir öğe için ona sor, o sana geri getiriyor, ve o çizginin dışına git. Eğer ihtiyacınız birden çok öğe, sadece almak gibi birçok öğe üzerinde her gidiş dönüş olarak hatırlıyorum, ama ihtiyacın dikkatli olmasını önlemek için işgal katip, bu öfke diğer müşteriler ardında.

Şimdi bunları göz önünde bulundurun. Bu mağaza ile bir katip, ne olursa olsun tüm yol cephe hattı, ve satış görevlisi "var mı, herhangi bir tuvalet kağıdı" o da dedi ki "Evet", ve sonra "Tamam, ben size geri alırsınız anlarım ne kadar ihtiyacım var", o zaman sen arka cephe hattı, saklayabilirsiniz elbette satılacak. Bu senaryo, iş parçacığı için güvenli bir koleksiyon tarafından engellenir.

İş parçacığı için güvenli bir koleksiyon eğer birden çok iş parçacığı tarafından erişilen bile, iç veri yapıları her zaman geçerli olduğunu garanti eder.

Olmayan iş parçacığı için güvenli bir toplama herhangi bir tür garanti ile gelmiyor. Örneğin, eğer bir şey eklemek için bir ikili ağaç üzerinde bir iş parçacığı, başka bir iş parçacığı meşgul yeniden dengeleme ağaç yok garanti öğe eklenecektir, hatta o ağaç hala geçerli daha sonra olabilir bozuk ötesinde bir umut.

İş parçacığı için güvenli bir koleksiyon, ancak konu üzerindeki sıralı işlemler aynı "" eğer bunun anlamı iç veri yapısı, bu gibi bir kod var: . anlık görüntü üzerinde çalışmak tüm garantilemez

if (tree.Count > 0)
    Debug.WriteLine(tree.First().ToString());

senin için yapmayacağım tree.Count ve başka bir iş parçacığı ağaçta kalan düğümleri boşalttı, First() null döner anlamına gelir tree.First(), çünkü bir NullReferenceException alabilirsiniz.

Bu senaryo için, ya da eğer söz konusu koleksiyon istediğini elde etmek için güvenli bir yol olup olmadığını görmek gerekir, belki de yukarıdaki kodu yeniden yazmak gerekir, ya da kilit gerekebilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bashirsultani

    bashirsultan

    22 Mart 2010
  • Breno Rises

    Breno Rises

    7 Ocak 2014
  • cyriak

    cyriak

    29 Mart 2006