我想创建一个静态锁
void foo(){
static CRITICAL_SECTION *lock = NULL; //this is the problem, I cannot create any primitive to do this with win32 threads
static long isInitialized = 0;
if (InterlockedExchange(&isInitialized, 1) == 0){ //this will ensure that lock is initialized only once
lock = (CRITICAL_SECTION*)malloc(sizeof(CRITICAL_SECTION));
InitializeCriticalSection(lock);
}
EnterCriticalSection(lock); //this might be called before initialization is done...YIKES!
...
LeaveCriticalSection(lock);
}
如何从多线程上下文中初始化锁?
糟糕的解决方案可能如下所示:
void foo(){
static CRITICAL_SECTION *lock = NULL; //this is the problem, I cannot create any primitive to do this with win32 threads
static long isInitialized = 0;
static volatile long isInitializeDone = 0;
if (InterlockedExchange(&isInitialized, 1) == 0){ //this will ensure that lock is initialized only once
lock = (CRITICAL_SECTION*)malloc(sizeof(CRITICAL_SECTION));
InitializeCriticalSection(lock);
isInitializeDone = 1;
} else {
while (isInitializeDone == 0){
}
}
EnterCriticalSection(lock); //this might be called before initialization is done...YIKES!
...
LeaveCriticalSection(lock);
}
但是有更好的解决方案吗?
最佳答案
如果这是 C++,您可以调用一个函数来初始化该临界区:
static CRITICAL_SECTION *lock = get_critical_section();
喜欢
CRITICAL_SECTION* get_critical_section()
{
CRITICAL_SECTION *lock = NULL;
InitializeCriticalSection(&lock);
return lock;
}
C++ 规定只有一个线程会初始化那个东西,所有其他线程都会等待它:
[stmt.dcl]
如果控制进入
在初始化变量时并发声明,并发执行等待
初始化完成。
编辑:我不知道从什么时候开始标准中的文本是这样的,但我很确定这是所有实现所做的。
关于c++ - 如何使用 win32 从多线程上下文初始化线程原语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21131645/