2012-02-20 13 views
7

एक कक्षा में, हमें थ्रेड के साथ काम पूरा करने के लिए सेमफोर का उपयोग करना पड़ा।sem_init (...): के लिए मान पैरामीटर क्या है?

पूर्णांक sem_init (sem_t * sem, pshared int, अहस्ताक्षरित int मान);: प्रोटोटाइप sem_init की (और हेडर फाइल) निम्नलिखित है

लेकिन मुझे समझ में नहीं आता कि मूल्य चर का उपयोग किस प्रकार किया जाता है। opengroup.org के अनुसार:

मूल्य

को सेमाफोर स्थापित करने के लिए एक प्रारंभिक मूल्य है "मूल्य एक मूल्य है ..." कैसे है कि मदद, इसके लिए इस्तेमाल किया क्या है करता है?

उत्तर

2

sem_init() मूल्य (अंतिम पैरामीटर) के साथ सेमफोर (पहला पैरामीटर) की ओर इशारा करता है, और आखिर में मेरा मानना ​​है कि यह वास्तव में आप जो पूछ रहे थे, int pshared आप ध्वज की तरह सोच सकते हैं। यदि pshared == 1 तो semaphore फोर्क किया जा सकता है।

संपादित करें: सेमफोर का मूल्य मान है क्योंकि आप सेमफोर की ओर इशारा करते हुए sem_wait (sem_t * sem) जैसे फ़ंक्शन का उपयोग करेंगे। यदि यह नकारात्मक है, तो ब्लॉक करें।

+1

इसका मतलब क्या है "मूल्य के साथ"?क्या इसका मतलब यह है कि यह लॉक/अनलॉक है? क्या यह सेमफोर की संभावित पूछताछ की संख्या निर्दिष्ट करता है? – SomethingSomething

1

आदेश "मूल्य" sem_init में समझने के लिए (sem_t * sem, pshared int, अहस्ताक्षरित int मान)

मुझे लगता है कि हम कैसे हम कोड में सेमाफोर का उपयोग के साथ सिंक्रनाइज़ की जरूरत है: जब हम चाहते हैं सेमफोर के लिए प्रतीक्षा करने के लिए, हम sem_wait (& mutex) को कॉल करते हैं, और यदि हम अन्य धागे 'sem_wait (& mutex) चलाने के लिए अधिसूचित करना चाहते हैं, तो हमें कॉल sem_post (& mutex) की आवश्यकता है। लेकिन समस्या यह है कि अगर कोई अन्य थ्रेड sem_post (& mutex) को पहले (सिस्टम प्रारंभिकरण में) पर कॉल करता है, तो sem_wait (& mutex) क्या करना चाहिए? इसे अन्य धागे के लिए पास या इंतजार करना चाहिए sem_post (& mutex) पर कॉल करें? उत्तर sem_init() में "मान" में है। यदि यह शून्य है, तो इसका मतलब है कि हमें sem_post() को एक बार कॉल करने के लिए कुछ अन्य धागे की प्रतीक्षा करनी होगी, फिर यह पास हो सकती है। यदि यह एक है, तो पहली बार sem_wait() के लिए कॉल करने पर एक बार गुजर जाएगा, लेकिन दूसरी बार sem_wait() प्रतीक्षा करेगा (यदि उनके दौरान कोई sem_post नहीं कहा जाता है)। तो sem_init() में मान का अर्थ है कि कितनी बार हम sem_wait() को वास्तव में बिना किसी sem_post() के इंतजार किए निष्पादित कर सकते हैं। और हम के रूप में sem_wait() विचार कर सकते हैं: /गतिरोध इंतजार कर रहे हैं जब तक मूल्य एक और धागा/

जबकि (मूल्य < = 0) {}

value-- से बड़ा से 0 करने के लिए बदल गया है ;

और जैसा कि sem_post() पर विचार करें:

मूल्य ++;

0

सेमफोर मान धागे के बीच साझा करने के लिए उपलब्ध सामान्य संसाधनों की संख्या का प्रतिनिधित्व करता है। यदि मान 0 से बड़ा है, तो थ्रेड कॉलिंग sem_wait को प्रतीक्षा करने की आवश्यकता नहीं है। यह केवल 1 से मूल्य कम करता है और आम संसाधन तक पहुंचने के लिए आय प्राप्त करता है। sem_post पूल में संसाधन वापस जोड़ देगा। तो यह मान 1 से बढ़ाता है। यदि मान 0 है, तो हम तब तक इंतजार करेंगे जब तक किसी ने sem_post नहीं किया है।

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