foreach
ループとクロージャのスレッド セーフティ
foreach
ループとクロージャーを使用する場合、スレッドの安全性を確保するには慎重な考慮が必要です。あなたが説明するシナリオには、クロージャ内の Foo オブジェクトへの参照を処理する方法が異なる 2 つのコード スニペットがあります。
最初のフラグメントは参照を直接渡します:
<code class="language-c#">foreach (Foo f in ListOfFoo) { Thread thread = new Thread(() => f.DoSomething()); threads.Add(thread); thread.Start(); }</code>
同じ 参照がすべてのスレッドで共有されるため、このアプローチは 安全ではありませんf
。これは、異なるスレッドが同じ Foo オブジェクトにアクセスして変更する可能性があり、予期しない動作が発生する可能性があることを意味します。
スレッドの安全性を確保するには、2 番目のスニペットに示すように、ループ内に参照のコピーを作成する必要があります。
<code class="language-c#">foreach (Foo f in ListOfFoo) { Foo f2 = f; Thread thread = new Thread(() => f2.DoSomething()); threads.Add(thread); thread.Start(); }</code>
ループ内に新しい f2
変数を作成することにより、各スレッドは Foo オブジェクトへの参照の独自のコピーを持ちます。これにより、各スレッドが一意のオブジェクト上で動作することが保証され、競合状態や潜在的なデータ破損が防止されます。
注: この問題はスレッドに固有の問題ではありません。非同期操作またはイベント ハンドラーでクロージャを使用する場合にも同じ問題が発生するため、予期しない動作を回避し、データの整合性を維持するために特別な注意が必要です。
以上がforeach ループはクロージャと一緒に使用するとスレッドセーフになりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。