2010-08-24 17 views

Respuesta

2

No, dado que los mutex de Windows son identificadores, se deben inicializar con CreateMutex().

Tenga en cuenta que la inicialización estática de pthread_mutex_t usando PTHREAD_MUTEX_INITIALIZER no es un init real, se realiza internamente en la primera llamada a pthread_mutex_lock() o pthread_mutex_trylock()

+1

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

+0

No estoy seguro, pero como pthread_mutex_lock es seguro para subprocesos, debería estar bien – CharlesB

7

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.

Cuestiones relacionadas