【发布时间】:2009-03-10 19:24:43
【问题描述】:
你好。我正在尝试为我的库创建一个完全线程安全的初始化函数,但我无法轻易找到 pthread_once 的替代方法,它应该很容易解决问题。我来到了这段代码:
void libInit (void)
{
#ifdef WIN32
static volatile int initialized = 0;
static HANDLE mtx;
if (!initialized)
{
if (!mtx)
{
HANDLE mymtx;
mymtx = CreateMutex(NULL, 0, NULL);
if (InterlockedCompareExchangePointer(&mtx, mymtx, NULL) != NULL)
CloseHandle(mymtx);
}
WaitForSingleObject(mtx);
if (!initialized)
{
libInitInternal();
initialized = 1;
}
ReleaseMutex(mtx);
}
#else
static pthread_once_t initialized = PTHREAD_ONCE_INIT;
pthread_once(&initialized, libInitInternal);
#endif
}
libInitInternal() 调用会导致线程不安全函数,该函数会初始化库。
我想听听关于我可能做错了什么或您是否知道更好的解决方案的任何建议。
【问题讨论】:
-
这是静态库还是 dll?
-
它不是 DLL。我知道 DLL 有一个初始化函数,但这不是我想要的。
标签: c winapi initialization