(理論的には) スレッドが 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 が同期されることを保証しますか? この種の競合状態に対して脆弱な実装またはアーキテクチャはありますか?