एक सेमफोर निर्माता-उपभोक्ता मॉडल के लिए स्पष्ट रूप से उपयुक्त है, हालांकि इसमें अन्य उपयोग हैं। आपका प्रोग्राम तर्क यह सुनिश्चित करने के लिए ज़िम्मेदार है कि प्रतीक्षा की संख्या के लिए पदों की सही संख्या बनाई गई है। यदि आप एक सेमफोर पोस्ट करते हैं और कोई भी इस पर इंतजार नहीं कर रहा है, तो जब वे प्रतीक्षा करते हैं तो वे तुरंत जारी रहते हैं। यदि आपकी समस्या ऐसी है कि इसे सेमफोर के गिनती मूल्य के संदर्भ में समझाया जा सकता है, तो इसे सेफफोर के साथ हल करना आसान होना चाहिए।
एक शर्त चर कुछ मामलों में थोड़ा और क्षमा कर रहा है। उदाहरण के लिए आप सभी वेटर्स को जागृत करने के लिए cond_broadcast का उपयोग कर सकते हैं, निर्माता के बिना यह जानने के लिए कि कितने हैं। और यदि आप किसी कन्वेयर को cond_signal करते हैं तो इसके साथ कोई भी इंतजार नहीं करता है तो कुछ भी नहीं होता है। यह अच्छा है अगर आपको पता नहीं है कि कोई श्रोता रुचि रखने वाला है या नहीं। यही कारण है कि श्रोता को हमेशा इंतजार करने से पहले म्यूटेक्स के साथ राज्य की जांच करनी चाहिए - अगर वे नहीं करते हैं तो वे एक सिग्नल याद कर सकते हैं और अगले तक जाग नहीं सकते (जो कभी नहीं हो सकता है)।
तो एक शर्त चर रुचि रखने वाले पक्षों को सूचित करने के लिए उपयुक्त है कि राज्य बदल गया है: आप म्यूटेक्स प्राप्त करते हैं, राज्य को बदलते हैं, सिग्वर (या प्रसारण) कंडवार को बदलते हैं और म्यूटेक्स को छोड़ देते हैं। यदि यह आपकी समस्या का वर्णन करता है तो आप कन्वेयर क्षेत्र में हैं। यदि विभिन्न श्रोताओं को अलग-अलग राज्यों में दिलचस्पी है तो आप बस प्रसारण कर सकते हैं और वे प्रत्येक बदले में जागृत हो जाएंगे, यह पता लगाएंगे कि उन्हें वह राज्य मिला है जो वे चाहते हैं, और यदि फिर से इंतजार नहीं किया जाता है।
यह वास्तव में एक म्यूटेक्स और सेमफोर के साथ इस तरह की चीज का प्रयास करने के लिए बहुत गहराई से है। समस्या तब आती है जब आप म्यूटेक्स लेना चाहते हैं, कुछ राज्य जांचें, फिर परिवर्तनों के लिए सेमफोर पर प्रतीक्षा करें। जब तक आप परमाणु रूप से म्यूटेक्स को छोड़ नहीं सकते और सेमफोर (जो कि आप जो नहीं कर सकते हैं) में प्रतीक्षा करते हैं, तो आप म्यूटेक्स धारण करते समय सेमफोर पर प्रतीक्षा कर सकते हैं। यह म्यूटेक्स को अवरुद्ध करता है, जिसका अर्थ यह है कि अन्य लोग उस बदलाव को बदलने के लिए नहीं ले सकते हैं जिसकी आप परवाह करते हैं। तो आप एक और म्यूटेक्स को इस तरह से जोड़ने का लुत्फ उठाएंगे जो आपकी विशिष्ट आवश्यकताओं पर निर्भर करता है। और शायद एक और सेमफोर। नतीजा आम तौर पर हानिकारक दौड़ की स्थिति के साथ गलत कोड है।
कंडीशन चर इस समस्या से बचते हैं, क्योंकि cond_wait को कॉल करना स्वचालित रूप से म्यूटेक्स को रिलीज़ करता है, इसे दूसरों द्वारा उपयोग के लिए मुक्त करता है। Mutex cond_wait रिटर्न से पहले वापस प्राप्त किया जाता है।
आईआईआरसी केवल सेफफोर्स का उपयोग करके एक प्रकार का कन्वेयर लागू करना संभव है, लेकिन अगर आप जिस म्यूटेक्स को कन्वेयर के साथ जाने के लिए कार्यान्वित कर रहे हैं, उसे ट्रायलॉक करना आवश्यक है, तो यह एक गंभीर सिर-स्क्रैचर है, और समय की प्रतीक्षा । सिफारिश नहीं की गई। इसलिए यह न मानें कि कंडवर के साथ आप जो कुछ भी कर सकते हैं वह सेफफोर्स के साथ किया जा सकता है। इसके अलावा म्यूटेक्स के अच्छे व्यवहार हो सकते हैं कि सेमेफोर की कमी, मुख्य रूप से प्राथमिकता-उलटा बचाव।
स्रोत
2008-09-20 18:21:54
मैं सिर्फ महसूस किया कि "ठीक से प्रारंभ सेमाफोर" ख़राब ढंग से परिभाषित किया गया है। क्या सैमफोर 1 या 0 तक सेट है? मैं कहूंगा कि इसे 0 पर सेट किया जाना चाहिए। फिर, क्या सैमफोर कैम-> स्थिति की रक्षा करता है या नहीं? – Blaisorblade
दूसरे स्निपेट में, जैसा कि अन्य उत्तरों में उल्लिखित है, म्यूटेक्स जारी नहीं होने पर आपका धागा अवरुद्ध हो जाएगा। तो आपकी 'sem_wait' विधि कभी वापस नहीं आएगी क्योंकि कोई अन्य थ्रेड म्यूटेक्स प्राप्त नहीं कर सकता है और' sem_signal 'को कॉल कर सकता है। हालांकि, अगर मैं 'sem_wait' से पहले mutex जारी करता हूं और प्रतीक्षा के बाद इसे फिर से आवश्यकता होती है तो मैं नहीं करूँगा। मुझे पता है कि ये कदम परमाणु नहीं हैं, तो क्या होगा? – sevenkplus