静的メンバー変数をフラグとして使用するクラスがあります。プログラムはマルチスレッド化されており、静的変数の値の変更はスレッド間で一貫して伝達されません。
コードは次のようになります。
MyClass.h ファイル:
class MyClass
{
private:
void runLoop();
static bool shutdownRequested;
};
MyClass.cpp ファイル:
bool MyClass::shutdownRequested = false; // static variable definition
void MyClass::runLoop()
{
// much code omitted
if (isShutdownNecessary() && !shutdownRequested)
{
shutdownRequested = true; // Race condition, but that's OK
MyLog::Error("Service shutdown requested");
// more code omitted
}
}
上記のログ行はおそらく 1 回だけ表示されると予想していましたが、理論的には、競合状態のためにスレッドごとに 1 回だけ表示される可能性があります。(私の場合、競合状態は許容されます。) ただし、スレッドごとに何十回もログ行が表示されます。MyLog クラスはログ行ごとにスレッド ID、プロセス ID なども記録するため、わかります。
これまでのところ、この問題は Windows リリース ビルドでのみ確認されています。Windows デバッグ ビルドや Linux ビルドではまだ確認していません。
マルチコア プロセッサのさまざまなコアでさまざまなスレッドが実行されているため、ログ行がスレッドごとに 1 回表示されることは理解できます。同じスレッドがログ行を何度も実行していることに驚きました。
これを引き起こす可能性のある特定のメカニズムと、静的変数の値の更新を強制的に認識させるためにできること(同期など)を誰かが明らかにすることはできますか?