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.
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
Nicht sicher, aber da pthread_mutex_lock Thread-sicher ist, sollte es in Ordnung sein – CharlesB