静态本地CCriticalSection无法正确启动

时间:2019-02-01 15:56:06

标签: multithreading mfc

我发现以下代码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会发生什么?

1 个答案:

答案 0 :(得分:0)

如果您使用的是Visual Studio 2015之前的版本,或其他不支持C ++ 11“ magic static”的编译器,则静态对象本身的构造将无法正确同步。

即使在Visual Studio 2015/2017中,也可以选择禁用“魔术静态”(/Zc:threadSafeInit