2015-09-10 11 views
5

मैं कुछ वातावरण में इस परिदृश्य परीक्षण किया है, और मैं निम्नलिखित प्रवाह मिल गया:क्या संभव है कि एक pthread_cond_wait() एकाधिक pthread_cond_signal() का उपभोग करता है?

expected

हालांकि, आदमी पन्नों से (http://linux.die.net/man/3/pthread_cond_wait) या (http://linux.die.net/man/3/pthread_cond_signal), मैं किसी भी गारंटी नहीं मिल सकता है कि निम्नलिखित परिदृश्य ऐसा नहीं हो सकता:

scenario

कौन सा है कि एक संकेत कर 2 धागे किसी भी प्रतीक्षा से पहले चला सकते हैं धागे को चलाने का मौका है। (समय निर्धारण संभावना)

[अब, मुझे पता है कि अगर यह संकेतबाहु साथ किया गया था, दूसरे परिदृश्य ऐसा कभी नहीं होता ... लेकिन मेरे मामले में मैं वास्तव में cond-वार्स के साथ ऐसा करने की जरूरत है!]

मेरे मामले में प्रत्येक पोस्ट भविष्यवाणी में वृद्धि करता है, इसलिए जब प्रतीक्षा थ्रेड 2 जागता है तो यह भविष्यवाणी (जो इस मामले में 2 से बढ़ी थी) की जांच करेगा, जिससे थ्रेड अब और सो नहीं जाएगा और इससे भविष्यवाणी 1 (अर्थात्) कि एक पोस्ट खपत थी)।

इस परिदृश्य हो सकता है, यह अर्थ होगा कि "Thread1" जाग नहीं हो सकता है जब तक एक और पद होता है, हालांकि विधेय दो बार (पोस्ट) की संख्या बढ़ गया था और केवल एक बार कम कर (Thread2 इंतजार)। इससे भी बदतर, तीसरा इंतजार कभी भी अवरुद्ध नहीं हो सकता क्योंकि यह पिछले लंबित अनुमानित वृद्धि का उपभोग करेगा।

मैं अभी तक इस समस्या को ट्रिगर नहीं कर सका, लेकिन क्या किसी को पता है कि यह एक संभावित परिदृश्य है या नहीं?


नोट इस संभावना को दूर करने के मैं pthread_cond_broadcast() द्वारा pthread_cond_signal() बदल दिया है ताकि दोनों Thread1 और Thread2 जगा और 2 वेतन वृद्धि का उपभोग करने की गारंटी है। हालांकि, यह समाधान प्रदर्शन को थोड़ा सा (शायद यहां तक ​​कि महत्वपूर्ण भी नहीं) कम करता है, और मुझे लगता है कि यह किसी को भी यह स्पष्ट नहीं है कि हम यहां प्रसारण का उपयोग क्यों कर रहे हैं।

उत्तर

7

नहीं, दो संकेतों का उपभोग करने के लिए pthread_cond_wait() के लिए यह संभव नहीं है।

pthread_cond_signal() कम से कम एक थ्रेड जागने की गारंटी है जो वर्तमान में स्थिति चर पर प्रतीक्षा कर रहा है। एक बार धागा संकेत दिया गया है, यह अब स्थिति चर पर इंतजार नहीं कर रहा है (हालांकि यह अभी भी संबंधित म्यूटेक्स पर इंतजार कर रहा है), इसलिए pthread_cond_signal() को अलग प्रतीक्षा थ्रेड (यदि कोई है) जागृत होना चाहिए।

(आपके दूसरे आरेख में, दूसरे सिग्नल को Thread2 के अलावा किसी थ्रेड को लक्षित करना चाहिए, क्योंकि Thread2 उस बिंदु पर स्थिति चर पर इंतजार नहीं कर रहा है)।

POSIX spec for pthread_cond_signal में सटीक शब्द है:

pthread_cond_signal() समारोह धागे कि निर्दिष्ट शर्त चर cond पर ब्लॉक किए गए हैं (यदि कोई सूत्र cond पर ब्लॉक किए गए हैं) के कम से कम एक अनवरोधित जाएगा।

+0

उत्तर के लिए धन्यवाद। मैं मान रहा था कि निष्पादन के क्षण तक एक थ्रेड अवरुद्ध किया गया था (पल जहां यह म्यूटेक्स प्राप्त करने का प्रयास करता है)। तो क्या ओएस पर धागे को "टैग" करने के लिए एक तंत्र है? (जिसका मतलब है कि प्रत्येक pthread_cond_signal() एक अलग थ्रेड "untag" करेगा?) – Pacheco

+1

@Pacheco: यह ओएस पर निर्भर करता है कि यह कैसे कार्यान्वित किया जाता है, लेकिन आम तौर पर हालत चर पर अवरुद्ध प्रक्रियाएं प्रतीक्षा कतार में होंगी, और स्थिति परिवर्तनीय संकेत परमाणु रूप से उस कतार से एक प्रक्रिया को स्थानांतरित करें। – caf

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