3

タスク並列ライブラリのスレッドへのデリゲートの内部は安全ですか?つまり、そのスレッドに分離されたそのデリゲート内で宣言された変数の値ですか?.NETでの並列タスクのスレッドセーフティ

例:

Parallel.ForEach(collection, item => { 
    var something = new Something(item.Property); 
}); 

は常に同じParallel操作によって作成された別のスレッドによって上書きされるから保護スレッドに固有であることが保証somethingですか?

+1

以下に説明するように、この例はスレッドセーフです。しかし、TPLを使用している場合には必ずしもそうではありません。タスクが独立しているかスレッドセーフであることを確認することは、プログラマの主な責任です。コンパイラの警告もツールもありません。 –

答えて

5

これはデリゲートsomethingあるので、それは値型である場合、ローカル変数と確かにスレッドセーフであり - もちろんの変数(共有参照オブジェクトへ参照を保持している場合、それはまだ上書きすることができますデリゲートがクロージャとして使用する変数への参照)

+0

'collection'に10個のアイテムがあり、TPLが10個のスレッドを生成する場合、10個のスレッドすべてが' something'と同じ参照を扱っている可能性がありますか? – lukiffer

+5

コレクション内に同じ参照が10個ある場合のみ。おそらく、コレクションには各エントリごとに一意のオブジェクトが存在すると考えられます。コレクションに同じオブジェクトが複数回追加されている場合、メモリ内の同じオブジェクトを参照する可能性があります。 –

+3

@lukiffer:あなたの事例が本当にデリゲートで何をしているのかが分からない場合、各スレッドは新しい 'Something'オブジェクトへの別の参照を保持します – BrokenGlass

関連する問題