説明が明確ではない:は安全ConcurrentBag <T>スレッドでParallel.ForEachです
バッグは、順序は重要ではありませんオブジェクトを格納するために有用であり、セットとは違って、バッグが重複をサポートしています。 ConcurrentBagは、同じスレッドがバッグに格納されたデータを生成して消費するシナリオ用に最適化された、スレッドセーフなバッグ実装です。
私の質問は、スレッドセーフであり、これがParallel.ForEachでConcurrentBagを使用することをお勧めします。例えば
:
私は定期的にリストを使用してParallel.ForEachで同期ロックを使用する必要はありませんこの方法です。
ありがとうございます。
これは実際にパフォーマンスを改善しますか?スレッドセーフであるために.Add関数は同期しませんか? (コメントアウトされたコードが完了するまでに0msかかると仮定します)。 – Sprague
同時収集では、ロックフリーと部分ロックの技術が混在しています。彼らはすべての操作のためにコレクション全体をロックしません。 –
ご清聴ありがとうございます。関心のある人には、私は実際にこれのベンチマークを実行し、CLRコードを逆コンパイルしました。 Interlocked.ExchangeとMonitor.Enterを使用します。私はこれがあなたが部分ロックとして言及しているものだと思いますか?いずれにしても、並列コードはほぼ毎回高速で実行され、反復量が非常に少なく、遅延が小さいために「バニラ」がパフォーマンスを向上させました。私は自分自身でこのテクニックを使用するかどうかはわかりません(コメントアウトされたコードはスレッドセーフである必要があることを忘れないでください)が、高速です。 – Sprague