静态本地 CCriticalSection 无法正常工作

Posted

技术标签:

【中文标题】静态本地 CCriticalSection 无法正常工作【英文标题】:static local CCriticalSection doesn't wok correctly 【发布时间】:2019-02-01 15:56:05 【问题描述】:

我发现下面的代码 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 会发生什么情况?

【问题讨论】:

“不起作用”——见How to Ask。 【参考方案1】:

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

即使在 Visual Studio 2015 / 2017 中,也可以选择禁用“magic static”(/Zc:threadSafeInit)

【讨论】:

以上是关于静态本地 CCriticalSection 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

转:CCriticalSection

临界段CCriticalSection的使用

在同一个线程中多次锁定 CCriticalSection 是好的做法吗?

如何制作同步对象字典?

虚拟机启动ES,本地无法使用静态Ip访问9200端口,虚拟也无法curl静态Ip的9200端口

关于SQLServer无法对数据库'XXX'执行删除,因为它正用于复制