Sí, esto es posible con unas pocas líneas de código. Aquí es un puerto de operaciones mutex compatible con pthread, incluyendo un MUTEX_INITIALIZER inicializador estático que desea:
#define MUTEX_TYPE HANDLE
#define MUTEX_INITIALIZER NULL
#define MUTEX_SETUP(x) (x) = CreateMutex(NULL, FALSE, NULL)
#define MUTEX_CLEANUP(x) (CloseHandle(x) == 0)
#define MUTEX_LOCK(x) emulate_pthread_mutex_lock(&(x))
#define MUTEX_UNLOCK(x) (ReleaseMutex(x) == 0)
int emulate_pthread_mutex_lock(volatile MUTEX_TYPE *mx)
{ if (*mx == NULL) /* static initializer? */
{ HANDLE p = CreateMutex(NULL, FALSE, NULL);
if (InterlockedCompareExchangePointer((PVOID*)mx, (PVOID)p, NULL) != NULL)
CloseHandle(p);
}
return WaitForSingleObject(*mx, INFINITE) == WAIT_FAILED;
}
Básicamente, desea que la inicialización suceda atómicamente cuando se utiliza el bloqueo de la primera vez. Si dos hilos entran en el cuerpo-si, solo uno logrará inicializar el bloqueo. Tenga en cuenta que no es necesario CloseHandle() para la vida útil del bloqueo estático.
Sí. Pero, si inicializo un mutex usando PTHREAD_MUTEX_INITIALIZER y dos hilos en paralelo llaman a pthread_mutex_lock, ¿dará lugar a algún problema? – Jay
No estoy seguro, pero como pthread_mutex_lock es seguro para subprocesos, debería estar bien – CharlesB