नीचे कॉलिंग जब यह 0 से काम नहीं करना चाहिए। जब यह 3 काम करता है तो कॉल करना। (मैं जावा के बारे में सोच रहा हूँ)।
मुझे कुछ और जोड़ने दें। बहुत से लोग ताले के बारे में सोचते हैं जैसे (बाइनरी) सेमफोर (यानी - एन = 1, इसलिए सेमफोर का मूल्य या तो 0 (आयोजित) या 1 (आयोजित नहीं) है)। लेकिन यह बिल्कुल सही नहीं है। लॉक में "स्वामित्व" की धारणा होती है, इसलिए यह "पुनर्वित्त" हो सकती है। इसका मतलब है कि एक धागा जिसमें ताला होता है, को फिर से लॉक() को कॉल करने की अनुमति दी जाती है (प्रभावी रूप से 0 से -1 तक गिनती को स्थानांतरित कर दिया जाता है), क्योंकि थ्रेड पहले से ही लॉक रखता है और इसे "पुन: प्राप्त करने" की अनुमति है। ताले भी गैर पुनर्वित्तक हो सकते हैं। लॉक धारक से अनलॉक() को लॉक() के समान संख्या में कॉल करने की उम्मीद है।
सेमफोरों के स्वामित्व की कोई धारणा नहीं है, इसलिए वे पुनर्वित्त नहीं कर सकते हैं, हालांकि उपलब्ध कई परमिट प्राप्त किए जा सकते हैं। इसका मतलब है कि किसी थ्रेड को ब्लॉक करने की आवश्यकता होती है जब यह 0 के मान से मुकाबला करता है, जब तक कोई सेमफोर में वृद्धि नहीं करता है।
इसके अलावा, मैंने जो देखा है (जो जावा है) में, आप एन से अधिक सेमफोर को बढ़ा सकते हैं, और यह भी स्वामित्व के साथ करना है: एक सेमफोर के पास स्वामित्व की कोई धारणा नहीं है, इसलिए कोई भी इसे और दे सकता है परमिट। धागे के विपरीत, जहां भी एक थ्रेड लॉक किए बिना अनलॉक() को कॉल करता है, यह एक त्रुटि है। (जावा में यह एक अपवाद फेंक देगा)।
आशा है कि इसके बारे में सोचने का यह तरीका मदद करता है।
यह भी देखें http://stackoverflow.com/questions/184147/countdownlatch-vs-semaphore – finnw