我发现以下代码CCriticalSection 无法正常工作。
foo()
{
//...
{
static CCriticalSection cs; //static local variable
CSingleLock lock(&cs, TRUE);
//Critical Section
non_reentrant_function();
}
//...
}
但是这些代码很好:
static CCriticalSection cs; //define a global static variable
foo()
{
//...
{
CSingleLock lock(&cs, TRUE);
//Critical Section
non_reentrant_function();
}
//...
}
众所周知,静态局部变量只有在函数foo首次被调用时才会被初始化。
如果多个线程调用 foo,静态本地 CCriticalSection 会发生什么情况?
如果你使用的是 Visual Studio 2015 之前,或者其他不支持 C++11"魔术静态"的编译器,则静态对象本身的构造不会正确同步。
即使在Visual Studio 2015/2017中,也可以选择禁用"魔术静态"(/Zc:threadSafeInit
)