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.
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
Eşzamanlı koleksiyonlarda kilitsiz ve kısmi kilitleme teknikleri kullanılır. Her operasyon için tüm koleksiyonu kilitlemezler. –
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