2010-08-24 13 views

cevap

2

Hayır, Windows mutex tanıtıcı olduğundan, bunlar CreateMutex() ile başlatılmalıdır. PTHREAD_MUTEX_INITIALIZER kullanarak pthread_mutex_t statik başlatma gerçek init değil

Not, bu pthread_mutex_lock() veya

+1

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

+0

Emin değilim, ancak pthread_mutex_lock iş parçacığı için güvenli olduğundan – CharlesB

7

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.