今日のコードレビューで、私は次のコードに出くわしました(投稿用に少し変更されています):
while (!initialized)
{
// The thread can start before the constructor has finished initializing the object.
// Can lead to strange behavior.
continue;
}
これは、新しいスレッドで実行されるコードの最初の数行です。別のスレッドでは、初期化が完了すると、に設定initialized
されtrue
ます。
オプティマイザーがこれを無限ループに変える可能性があることは知っていますが、それを回避するための最良の方法は何ですか?
volatile
-有害と考えられる- 変数を直接使用する代わりに関数を呼び出す
isInitialized()
-これはメモリバリアを保証しますか?関数が宣言された場合はどうなりますinline
か?
他に選択肢はありますか?
編集:
これについてはもっと早く言及する必要がありますが、これはWindows、Linux、Solarisなどで実行する必要のあるポータブルコードです。ポータブルスレッドライブラリには主にBoost.Threadを使用しています。