【发布时间】:2014-01-15 07:41:50
【问题描述】:
我想创建一个静态锁
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);
}
但是有更好的解决方案吗?
【问题讨论】:
-
如果可能的话,通过在启动多个将使用该原语进行同步的线程之前初始化每个原语来避免该问题。
-
@xaizek 如果我不需要支持 windows xp 那就完美了
-
您意识到代码中没有为临界区分配任何内存?此外,您应该将指向临界区的指针传递给 InitializeCriticalSection,而不是指向指针的指针。
-
@HarryJohnston 是的,这是一个错字。不过修复它。
标签: c++ c windows multithreading