pthread hỗ trợ khởi tạo tĩnh của pthread_mutex_t bằng PTHREAD_MUTEX_INITIALIZER.Có thể khởi tạo tĩnh các mutex trong Windows không?
Có thể đạt được một cơ chế tĩnh tương tự để khởi tạo mutex bằng Windows mutex không?
pthread hỗ trợ khởi tạo tĩnh của pthread_mutex_t bằng PTHREAD_MUTEX_INITIALIZER.Có thể khởi tạo tĩnh các mutex trong Windows không?
Có thể đạt được một cơ chế tĩnh tương tự để khởi tạo mutex bằng Windows mutex không?
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()
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ó. 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
Không chắc chắn, nhưng vì pthread_mutex_lock là an toàn chỉ nên OK – CharlesB