Evet, bu kodun birkaç satır ile mümkündür pthread_mutex_trylock()
ilk çağrı dahili olarak yapılacaktır. Burada istediğiniz statik başlatıcı MUTEX_INITIALIZER dahil pthread uyumlu mutex operasyonlar, bir liman:
#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;
}
Temel olarak, kilit ilk kez kullanıldığında başlatma atomik olmasını istiyorum. Eğer iki iplik if-gövdesine girerse, o zaman kilidi başlatmak için sadece biri başarılı olur. Statik kilitin ömrü boyunca CloseHandle() öğesine gerek olmadığını unutmayın.
Evet. Ancak, PTHREAD_MUTEX_INITIALIZER kullanarak bir muteks başlatırsam ve iki iş parçacığı sadece pthread_mutex_lock çağırırsa, herhangi bir soruna yol açar mı? – Jay
Emin değilim, ancak pthread_mutex_lock iş parçacığı için güvenli olduğundan – CharlesB