11

これは少しばかげているように思えるかもしれませんが、奇妙な動作を引き起こさないことが合理的に確信できる場合は、より大きなライブラリの一部として検討しているアプローチです。

アプローチ:

SynchronizationContextスレッド プールにディスパッチするasync ユーザー コードを実行します。ユーザーコードは次のようになります。

async void DoSomething()
{
    int someState = 2;
    await DoSomethingAsync();
    someState = 4;
    await DoSomethingElseAsync();
    // someState guaranteed to be 4?
}

へのアクセスがスレッドセーフかどうかはわかりませんsomeState。コードは 1 つの「スレッド」で実行されるため、操作は実際には完全に順序付けられていますが、内部では複数のスレッドに分割される可能性があります。私の理解が正しければ、x86 では順序付けが安全であるはずです。また、変数が共有されていないため、コンパイラの最適化などについて心配する必要はありません。

しかし、もっと重要なことは、これが ECMA または CLR メモリ モデルの下でスレッド セーフであることが保証されるかどうかということです。

キューに入れられた作業を実行する前にメモリバリアを挿入する必要があることは確かですが、ここでの私の推論に完全に自信があるわけではありません (または、このアプローチはまったく別の理由で機能しない可能性があります)。

4

1 に答える 1

10

asyncこれは、 / awaitFAQのコメント セクションで回答されています。

TPL には、タスクがキューに入れられたとき、およびタスク実行の開始時/終了時に適切なバリアが含まれているため、値が適切に表示されます。

したがって、明示的な障壁は必要ありません。

于 2012-11-13T13:14:01.443 に答える