Ahoj. Snažím se, aby se inicializační funkci plně thread-safe pro mé knihovně a já nemohl snadno najít alternativu k pthread_once, což by mělo velice snadno vyřešit tento problém. Přišel jsem do tohoto kódu:
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()
Volání vede k funkci nití nebezpečné, že inicializuje knihovny.
Rád bych slyšel nějaké návrhy na to, co bych mohl dělat špatně, nebo jestli víte o lepší řešení.