你好.我试图为我的库创建一个完全线程安全的初始化函数,我不能轻易找到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()
调用导致线程安全的功能,即初始化库.
我想听听有关我可能做错的建议或是否了解更好的解决方案.
我想你想使用一次性初始化功能.在同步模式下,所有线程都会阻塞,直到调用它的第一个线程完成.似乎与pthread_once()类似.
这里有示例代码.
所以在你的情况下,你会说:
BOOL CALLBACK CallLibInitInternal(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *lpContex) { libInitInternal(); return TRUE; } void libInit() { #ifdef WIN32 static INIT_ONCE s_init_once; InitOnceExecuteOnce(&s_init_once, CallLibInitInternal, NULL, NULL); #else ... #endif }