静态本地 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 是好的做法吗?