मैं कुछ वातावरण में इस परिदृश्य परीक्षण किया है, और मैं निम्नलिखित प्रवाह मिल गया:क्या संभव है कि एक pthread_cond_wait() एकाधिक pthread_cond_signal() का उपभोग करता है?
हालांकि, आदमी पन्नों से (http://linux.die.net/man/3/pthread_cond_wait) या (http://linux.die.net/man/3/pthread_cond_signal), मैं किसी भी गारंटी नहीं मिल सकता है कि निम्नलिखित परिदृश्य ऐसा नहीं हो सकता:
कौन सा है कि एक संकेत कर 2 धागे किसी भी प्रतीक्षा से पहले चला सकते हैं धागे को चलाने का मौका है। (समय निर्धारण संभावना)
[अब, मुझे पता है कि अगर यह संकेतबाहु साथ किया गया था, दूसरे परिदृश्य ऐसा कभी नहीं होता ... लेकिन मेरे मामले में मैं वास्तव में cond-वार्स के साथ ऐसा करने की जरूरत है!]
मेरे मामले में प्रत्येक पोस्ट भविष्यवाणी में वृद्धि करता है, इसलिए जब प्रतीक्षा थ्रेड 2 जागता है तो यह भविष्यवाणी (जो इस मामले में 2 से बढ़ी थी) की जांच करेगा, जिससे थ्रेड अब और सो नहीं जाएगा और इससे भविष्यवाणी 1 (अर्थात्) कि एक पोस्ट खपत थी)।
इस परिदृश्य हो सकता है, यह अर्थ होगा कि "Thread1" जाग नहीं हो सकता है जब तक एक और पद होता है, हालांकि विधेय दो बार (पोस्ट) की संख्या बढ़ गया था और केवल एक बार कम कर (Thread2 इंतजार)। इससे भी बदतर, तीसरा इंतजार कभी भी अवरुद्ध नहीं हो सकता क्योंकि यह पिछले लंबित अनुमानित वृद्धि का उपभोग करेगा।
मैं अभी तक इस समस्या को ट्रिगर नहीं कर सका, लेकिन क्या किसी को पता है कि यह एक संभावित परिदृश्य है या नहीं?
नोट इस संभावना को दूर करने के मैं pthread_cond_broadcast()
द्वारा pthread_cond_signal()
बदल दिया है ताकि दोनों Thread1
और Thread2
जगा और 2 वेतन वृद्धि का उपभोग करने की गारंटी है। हालांकि, यह समाधान प्रदर्शन को थोड़ा सा (शायद यहां तक कि महत्वपूर्ण भी नहीं) कम करता है, और मुझे लगता है कि यह किसी को भी यह स्पष्ट नहीं है कि हम यहां प्रसारण का उपयोग क्यों कर रहे हैं।
उत्तर के लिए धन्यवाद। मैं मान रहा था कि निष्पादन के क्षण तक एक थ्रेड अवरुद्ध किया गया था (पल जहां यह म्यूटेक्स प्राप्त करने का प्रयास करता है)। तो क्या ओएस पर धागे को "टैग" करने के लिए एक तंत्र है? (जिसका मतलब है कि प्रत्येक pthread_cond_signal() एक अलग थ्रेड "untag" करेगा?) – Pacheco
@Pacheco: यह ओएस पर निर्भर करता है कि यह कैसे कार्यान्वित किया जाता है, लेकिन आम तौर पर हालत चर पर अवरुद्ध प्रक्रियाएं प्रतीक्षा कतार में होंगी, और स्थिति परिवर्तनीय संकेत परमाणु रूप से उस कतार से एक प्रक्रिया को स्थानांतरित करें। – caf