Opis ConcurrentBag na MSDN nie jest jasne:Czy Parallel.ForEach w ConcurrentBag <T> bezpieczny wątku
Torby są przydatne do przechowywania przedmiotów podczas zamawiania nie ma znaczenia, w odróżnieniu od zestawów, torby obsługują duplikatów. ConcurrentBag to implementacja worka bezpieczna dla wątków, zoptymalizowana pod kątem scenariuszy, w których ten sam wątek będzie zarówno produkować, jak i konsumować dane przechowywane w torbie.
Moje pytanie jest bezpieczne dla wątków i jeśli jest to dobra praktyka do korzystania z ConcurrentBag w Parallel.ForEach.
Na przykład:
ten sposób nie muszę używać blokowania synchronizacji w Parallel.ForEach stosując regularną listę.
Wielkie dzięki.
Czy to rzeczywiście poprawia wydajność? Czy funkcja .Add nie zostanie zsynchronizowana, aby była bezpieczna dla wątków? (przy założeniu, że wykreślony kod trwa 0ms). – Sprague
W kolekcjach współbieżnych stosuje się kombinację technik blokowania i blokowania częściowego. Nie blokują całej kolekcji dla każdej operacji. –
Dzięki za wyjaśnienie. Dla zainteresowanych zainicjowałem test porównawczy tego rozwiązania, a także dekompilowałem kod CLR. Używa Interlocked.Exchange i Monitor.Enter. Przypuszczam, że właśnie to nazywasz częściowym blokowaniem? W każdym razie kod równoległy działał szybciej za każdym razem, tylko w przypadku bardzo niskich wartości iteracji i małych opóźnień, sposób "waniliowy" poprawiał wydajność. Nie jestem pewien, czy sam bym użył tej techniki (nie zapominaj, że zakodowany kod musi być bezpieczny dla wątków!), Ale jest szybki. – Sprague