मैं लिनक्स में pthread का उपयोग करके मैन्युअल रीसेट इवेंट लागू कर रहा हूं जो कि विंडोज में WaitForSingleEvent के समान है। मुझे यह पोस्ट मिली
pthread-like windows मैन्युअल-रिसेट इवेंट
और इसका पालन करें, हालांकि एक ऐसी चीज है जो मुझे भ्रमित करती है:
void mrevent_wait(struct mrevent *ev) {
pthread_mutex_lock(&ev->mutex);
while (!ev->triggered)
pthread_cond_wait(&ev->cond, &ev->mutex);
pthread_mutex_unlock(&ev->mutex);
}
- pthread_cond_wait: एटोमिकली म्यूटेक्स को छोड़ दें और कॉलिंग थ्रेड को कंडीशन वेरिएबल कंडिशन पर ब्लॉक करें;
- pthread_mutex_unlock: निर्दिष्ट म्यूटेक्स को अनलॉक करने का प्रयास। यदि म्यूटेक्स प्रकार PTHREAD_MUTEX_NORMAL है, तो त्रुटि का पता नहीं लगाया जाता है। यदि कोई थ्रेड म्यूटेक्स को अनलॉक करने का प्रयास करता है जो है बंद नहीं किया है या एक म्यूटेक्स जो अनलॉक किया गया है, अपरिभाषित व्यवहार परिणाम।
जब मुझे डर लगता है, जब pthread_cond_wait म्यूटेक्स जारी करता है, तब pthread_mutex_unlock अपरिभाषित व्यवहार आ सकता है (इस तरह की बात मुझे पागल कर देगी, वे इसे कैसे नहीं संभालेंगे :-D)
धन्यवाद।
उत्तर:
जवाब के लिए 9 № 1मानक कहते हैं:
सफल वापसी पर, म्यूटेक्स के पास है बंद कर दिया गया है और इसके स्वामित्व में है कॉलिंग थ्रेड।
जिसका अर्थ है कि लौटते समय, pthread_cond_wait
atomically संबंधित म्यूटेक्स को लॉक करता है।
वर्कफ़्लो इस तरह है:
- आप म्यूटेक्स को लॉक करें
pthread_cond_wait
एटमॉली ब्लॉक और म्यूटेक्स को अनलॉक करता है (इसलिए अन्य धागे यहां मिल सकते हैं)- जब कोई स्थिति आती है,
pthread_cond_wait
परमाणु वापस आता है और म्यूटेक्स को लॉक करता है
- आप म्यूटेक्स को अनलॉक करें
मुझे नहीं लगता कि pthread_cond_wait ब्लॉक और अनलॉक करता है
क्योंकि आपने जो लिंक दिया था, उसे आपने पढ़ा नहीं है।
ये कार्य परमाणु मुक्त म्यूटेक्स और कॉलिंग थ्रेड को कारण खंड कंडिशन वेरिएबल कंडोम पर;