4

(理論的には) スレッドが 1 つの CPU で を実行した後、すぐにが実行されなかっacquireた別の CPU でプリエンプトされて再開される可能性はありますか?acquire

たとえば。C++11 アトミックとrelease-acquireメモリ順序付けを使用して、ロックのないスレッドセーフな初期化を実行する次のコードを検討してください。

if ( false == _initFlag.load(memory_order_acquire) ) {
    _foo = ...; // initialize global
    _bar = ...; // initialize global
    ... = ...; // initialize more globals
    _initFlag.store(true, memory_order_release);
}
// use the initialized values ...

true を返す場合_initFlag.load(memory_order_acquire)、呼び出し元のスレッドは_foo、 、 などの初期化された値が現在実行中_barの CPU に可視 (伝播) であることを認識します。しかし、スレッドがその直後に横取りされ、別の CPU に移動された場合はどうなるでしょうか?..

C++11 標準は、新しい CPU が同期されることを保証しますか? この種の競合状態に対して脆弱な実装またはアーキテクチャはありますか?

4

1 に答える 1