2010-08-24 33 views

Trả lời

2

Không, vì Windows mutex là chốt, chúng phải được khởi tạo với CreateMutex().

Lưu ý rằng việc khởi tạo tĩnh của pthread_mutex_t sử dụng PTHREAD_MUTEX_INITIALIZER không phải là một init thực, nó sẽ được thực hiện trong nội bộ tại các cuộc gọi đầu tiên để pthread_mutex_lock() hoặc pthread_mutex_trylock()

+1

Có. Nhưng, nếu tôi khởi tạo một mutex bằng cách sử dụng PTHREAD_MUTEX_INITIALIZER và hai chủ đề parallely gọi pthread_mutex_lock, nó sẽ dẫn đến bất kỳ vấn đề? – Jay

+0

Không chắc chắn, nhưng vì pthread_mutex_lock là an toàn chỉ nên OK – CharlesB

7

Có, đây là có thể với một vài dòng mã. Đây là một cảng hoạt động mutex pthread-tương thích, trong đó có một MUTEX_INITIALIZER initializer tĩnh mà bạn muốn:

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

Về cơ bản, bạn muốn khởi tạo để xảy ra atomically khi khóa được sử dụng lần đầu tiên. Nếu hai luồng vào if-body, thì chỉ có một chủ đề khởi tạo khóa. Lưu ý rằng không cần phải CloseHandle() cho tuổi thọ của khóa tĩnh.

Các vấn đề liên quan