2011-07-08 12 views
7
MSDN上ConcurrentBagの

説明が明確ではない:は安全ConcurrentBag <T>スレッドでParallel.ForEachです

バッグは、順序は重要ではありませんオブジェクトを格納するために有用であり、セットとは違って、バッグが重複をサポートしています。 ConcurrentBagは、同じスレッドがバッグに格納されたデータを生成して消費するシナリオ用に最適化された、スレッドセーフなバッグ実装です。

私の質問は、スレッドセーフであり、これがParallel.ForEachでConcurrentBagを使用することをお勧めします。例えば

私は定期的にリストを使用してParallel.ForEachで同期ロックを使用する必要はありませんこの方法です。

ありがとうございます。

答えて

6

それは私にはうまく見えます。あなたがそれを使用している方法は、スレッドセーフです。

IEnumerable<XYZ>を返すことができた場合、完了したらList<T>にコピーしないと効率が向上する可能性があります。

+0

これは実際にパフォーマンスを改善しますか?スレッドセーフであるために.Add関数は同期しませんか? (コメントアウトされたコードが完了するまでに0msかかると仮定します)。 – Sprague

+0

同時収集では、ロックフリーと部分ロックの技術が混在しています。彼らはすべての操作のためにコレクション全体をロックしません。 –

+0

ご清聴ありがとうございます。関心のある人には、私は実際にこれのベンチマークを実行し、CLRコードを逆コンパイルしました。 Interlocked.ExchangeとMonitor.Enterを使用します。私はこれがあなたが部分ロックとして言及しているものだと思いますか?いずれにしても、並列コードはほぼ毎回高速で実行され、反復量が非常に少なく、遅延が小さいために「バニラ」がパフォーマンスを向上させました。私は自分自身でこのテクニックを使用するかどうかはわかりません(コメントアウトされたコードはスレッドセーフである必要があることを忘れないでください)が、高速です。 – Sprague

0

ConcurrentBagとParallel.ForEachは私にとっては問題ありません。大量のマルチユーザーアクセスを持つシナリオでこのタイプを使用すると、実装のこれらのクラスによって、Webサーバーをクラッシュさせる可能性のあるレベルにCPUプロセスが起きる可能性があります。さらに、この実装はN回のタスク(スレッド)を開始して各繰り返しを実行します。したがって、このクラスの選択と実装には注意が必要です。私は最近、このような状況で過ごしました。ウェブアプリケーションコアに何が起こったのかを分析するために、メモリダンプを抽出する必要がありました。したがって、ConcurrentbagはThreadSafeであり、Webシナリオではそれは良い方法ではないので注意してください。

関連する問題