2010-08-24 4 views

Antwort

2

Nein, da Windows-Mutex Handles sind, müssen sie mit CreateMutex() initialisiert werden.

Beachten Sie, dass die statische Initialisierung von pthread_mutex_t PTHREAD_MUTEX_INITIALIZER verwendet, ist kein echter init, wird es intern beim ersten Aufruf zu pthread_mutex_lock() oder pthread_mutex_trylock()

+1

Ja. Aber wenn ich einen Mutex mit PTHREAD_MUTEX_INITIALIZER initialisiere und zwei Threads parallel pthread_mutex_lock aufrufen, führt das dann zu irgendeinem Problem? – Jay

+0

Nicht sicher, aber da pthread_mutex_lock Thread-sicher ist, sollte es in Ordnung sein – CharlesB

7

Ja erfolgen, dies ist möglich mit ein paar Zeilen Code. Hier ist eine Portierung von pthread-kompatibelen Mutex-Operationen, einschließlich einem statischen Initialisierer MUTEX_INITIALIZER, die Sie wollen:

#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; 
} 

Grundsätzlich Sie die Initialisierung wollen atomar passieren, wenn das Schloss zum ersten Mal verwendet wird. Wenn zwei Threads den if-body eingeben, kann nur einer die Sperre initialisieren. Beachten Sie, dass CloseHandle() für die Lebensdauer der statischen Sperre nicht benötigt wird.