静态本地 CCriticalSection 无法正确打开



我发现以下代码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

相关内容

  • 没有找到相关文章