2011-07-08 20 views
7
MSDN'deki ConcurrentBag ait

Açıklama açık değildir:güvenli ConcurrentBag <T> dizisindeki Parallel.ForEach mi

Çanta sipariş önemli değil nesneleri depolamak için faydalıdır ve setleri aksine, çantalar çiftleri destekler. ConcurrentBag, aynı ipliğin torbada saklanan verileri üretip tüketeceği senaryolar için optimize edilmiş, iplik güvenli bir torba uygulamasıdır.

Sorum şu ki, iş parçacığı güvenlidir ve bu Parallel.ForEach içinde ConcurrentBag kullanmak için iyi bir uygulama ise. Derece için

:

Normal Listesini kullanarak Parallel.ForEach senkronizasyon kilitleme kullanmak gerekmez Bu şekilde.

Çok teşekkürler.

cevap

6

Bana iyi görünüyor. Kullandığınız yöntem, diş güvenlidir.

Bir IEnumerable<XYZ> döndürebilirseniz, işiniz bittiğinde List<T> numarasına kopyalama yapmadan daha verimli hale getirilebilir.

+0

Bu gerçekten performansta herhangi bir gelişme sağlıyor mu? İş parçacığı güvenli olması için .Add işlevi eşitlenmez mi? (yorumlanan kodun tamamlanması için 0ms aldığını varsayarak) – Sprague

+0

Eşzamanlı koleksiyonlarda kilitsiz ve kısmi kilitleme teknikleri kullanılır. Her operasyon için tüm koleksiyonu kilitlemezler. –

+0

Netleştirdiğiniz için teşekkür ederiz. İlgilenenler için aslında bunun bir kıyaslamasını yaptım ve aynı zamanda CLR kodunu da çözdüm. Interlocked.Exchange ve Monitor.Enter kullanır. Sanırım kısmi kilitleme olarak bahsettiğin şey bu mu? Her halükarda, paralel kod neredeyse her zaman daha hızlı koştu, sadece çok düşük iterasyon miktarları ve küçük gecikmeler için 'vanilya' yöntemi performansı artırdı. Bu tekniği kendim kullanacağımdan emin değilim (kodun thread-safe olması gerektiğine dair yorum yapmayı unutmayın!), Fakat hızlıdır. – Sprague

0

ConcurrentBag ve Parallel.ForEach bana göre, sorun değil. Bu tür büyük hacimli çok kullanıcılı erişime sahip senaryolarda kullanırsanız, uygulamanızdaki bu sınıflar cpu işlemini web sunucunuzu çökebilecek düzeylere yükseltebilir. Ayrıca, bu uygulama, yineleme her birini yürütmek için N görevleri (konuları) başlar, bu yüzden bu sınıflar ve uygulamalar arasında seçim yaparken dikkatli olun. Son zamanlarda bu durumda harcadım ve web uygulama çekirdeğime ne olduğunu analiz etmek için bellek dökümü çıkarmak zorunda kaldım. Bu yüzden dikkatli olun çünkü Concurrentbag ThreadSafe ve web senaryolarında daha iyi bir yol değildir.

İlgili konular