我有一个使用静态成员变量作为标志的类。该程序是多线程的,并且对静态变量值的更改不会在线程之间一致地进行通信。
代码如下所示:
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
}
}
我预计上面显示的日志行可能只出现一次,但由于竞争条件,理论上每个线程可能出现一次。(在我的情况下,竞争条件是可以接受的。)但是,我看到日志行每个线程出现了几十次。我可以说出来,因为 MyLog 类还记录每个日志行的线程 ID、进程 ID 等。
到目前为止,我只在 Windows 发布版本中观察到了这个问题。我还没有在 Windows 调试版本或 Linux 版本中观察到它。
由于在多核处理器的不同内核上运行不同的线程,我可以理解每个线程查看一次日志行。我很惊讶地看到相同的线程一遍又一遍地执行日志行。
任何人都可以阐明可能导致这种情况发生的特定机制,以及我可以做什么(例如同步)来强制更新静态变量的值以被识别?