2010-08-24 15 views
6

pthread PTHREAD_MUTEX_INITIALIZER का उपयोग करके pthread_mutex_t की स्थिर प्रारंभिकरण का समर्थन करता है।क्या विंडोज में म्यूटेक्स की स्थाई प्रारंभ करना संभव है?

यह विंडोज म्युटेक्स का उपयोग कर म्युटेक्स आरंभीकरण के लिए एक समान स्थिर तंत्र प्राप्त करने के लिए संभव है?

उत्तर

2

नहीं, विंडोज म्युटेक्स के बाद से हैंडल कर रहे हैं, वे CreateMutex() साथ प्रारंभ किया जाना चाहिए।

ध्यान दें कि PTHREAD_MUTEX_INITIALIZER का उपयोग कर pthread_mutex_t के स्थिर आरंभीकरण कोई वास्तविक init नहीं है, यह pthread_mutex_lock() या pthread_mutex_trylock()

+1

हां। लेकिन, अगर मैं PTHREAD_MUTEX_INITIALIZER का उपयोग करके एक म्यूटक्स प्रारंभ करता हूं और दो धागे समानांतर कॉल pthread_mutex_lock कहते हैं, तो क्या इससे कोई समस्या हो सकती है? – Jay

+0

निश्चित नहीं है, लेकिन चूंकि pthread_mutex_lock थ्रेड-सुरक्षित है, यह ठीक होना चाहिए – CharlesB

7

हाँ, यह कोड की कुछ लाइनों के साथ संभव है करने के लिए पहली कॉल पर आंतरिक रूप से किया जाएगा। यहाँ 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() की आवश्यकता नहीं है।

संबंधित मुद्दे