Hello. Я пытаюсь создать полностью поточно-ориентированную функцию инициализации для своей библиотеки, и я не могу легко найти альтернативу 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()
приводит к небезопасной функции, которая инициализирует библиотеку.
Я хотел бы услышать любые предложения о том, что я могу делать неправильно, или знаете ли вы о лучшем решении.