我发现以下代码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会发生什么?
答案 0 :(得分:0)
如果您使用的是Visual Studio 2015之前的版本,或其他不支持C ++ 11“ magic static”的编译器,则静态对象本身的构造将无法正确同步。
即使在Visual Studio 2015/2017中,也可以选择禁用“魔术静态”(/Zc:threadSafeInit
)