हाँ, यह कोड की कुछ लाइनों के साथ संभव है करने के लिए पहली कॉल पर आंतरिक रूप से किया जाएगा। यहाँ pthread संगत एक स्थिर प्रारंभकर्ता MUTEX_INITIALIZER जो आप चाहते सहित म्युटेक्स संचालन, का एक पोर्ट है:
#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;
}
मूल रूप से, आप प्रारंभ atomically होने की जब ताला पहली बार प्रयोग किया जाता है चाहता हूँ। यदि दो धागे if-body में प्रवेश करते हैं, तो ताला शुरू करने में केवल एक ही सफल होता है। ध्यान दें कि स्थिर लॉक के जीवनकाल के लिए CloseHandle() की आवश्यकता नहीं है।
स्रोत
2012-02-28 21:36:03
हां। लेकिन, अगर मैं PTHREAD_MUTEX_INITIALIZER का उपयोग करके एक म्यूटक्स प्रारंभ करता हूं और दो धागे समानांतर कॉल pthread_mutex_lock कहते हैं, तो क्या इससे कोई समस्या हो सकती है? – Jay
निश्चित नहीं है, लेकिन चूंकि pthread_mutex_lock थ्रेड-सुरक्षित है, यह ठीक होना चाहिए – CharlesB