Inicialização da biblioteca - pthread_once na implementação do Win32

Olá. Estou tentando criar uma função de inicialização totalmente segura para threads para minha biblioteca e não consegui encontrar facilmente uma alternativa para pthread_once, o que deve resolver o problema com muita facilidade. Eu vim para este código:


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
}

OlibInitInternal() chamada @ leva a uma função insegura de thread, que inicializa a bibliotec

Gostaria de ouvir sugestões sobre o que eu poderia estar fazendo de errado ou se você conhece uma solução melho

questionAnswers(5)

yourAnswerToTheQuestion