हालत चर के एक उपयोग जो कि केवल एक संदेश कतार की तुलना में थोड़ा अधिक जटिल है, "लॉक साझा करें" है, जहां विभिन्न धागे समान मूल प्रकृति की अलग-अलग स्थितियों के लिए प्रतीक्षा कर रहे हैं। उदाहरण के लिए, आपके पास एक (बहुत शर्मीली, सरलीकृत) वेब कैश है। कैश में प्रत्येक प्रविष्टि में तीन संभावित राज्य होते हैं: उपस्थित नहीं, IN_PROGRESS, पूर्ण।
getURL:
lock the cache
three cases for the key:
not present:
add it (IN_PROGRESS)
release the lock
fetch the URL
take the lock
update to COMPLETE and store the data
broadcast the condition variable
goto COMPLETE
COMPLETE:
release the lock and return the data
IN_PROGRESS:
while (still IN_PROGRESS):
wait on the condition variable
goto COMPLETE
व्यवहार में मैं अनुसूचक से किसी भी मदद के बिना POSIX समारोह pthread_once
का एक प्रकार लागू करने के लिए पैटर्न का इस्तेमाल किया। कारण मैं एक सेमफोर का उपयोग नहीं कर सकता था या प्रति once_control
लॉक कर सकता था, और केवल लॉक के तहत प्रारंभिकता करता हूं, यह है कि फ़ंक्शन को विफल करने की अनुमति नहीं थी, और once_control
में केवल मामूली प्रारंभिकता थी। उस मामले के लिए, pthread_once
में स्वयं परिभाषित त्रुटि कोड नहीं हैं, इसलिए इसे संभवतः विफल करने के लिए इसे लागू करना आपके कॉलर को किसी भी अच्छे विकल्प के साथ नहीं छोड़ता है ...
बेशक इस पैटर्न के साथ आपको स्केलिंग के बारे में सावधान रहना होगा। प्रत्येक बार जब कोई प्रारंभिकता पूरी हो जाती है, तो प्रत्येक प्रतीक्षा धागा ताला पकड़ने के लिए उठता है। तो जब आप सिस्टम को डिज़ाइन करते हैं तो आप शेरिंग के बारे में बहुत सावधानी से सोचते हैं, और फिर निर्णय लेते हैं कि जब तक आप सिद्ध प्रदर्शन समस्याओं को देखते हैं, तब तक आपको वास्तव में इसे लागू करने के लिए कुछ भी परेशान नहीं किया जा सकता है।
स्रोत
2010-03-19 11:32:15
क्या यह समुदाय विकी होना चाहिए? – jasonline
चूंकि आप एक विशिष्ट उत्तर की तलाश नहीं कर रहे हैं और शायद अधिक सामान्य "उत्तर", शायद। लेकिन मैं इस की बाड़ पर अधिक हूं, आप दूसरों से ना या यारे की प्रतीक्षा कर सकते हैं। – GManNickG
+1 इस अच्छे प्रश्न के लिए आप अच्छी तरह से अर्जित प्रतिष्ठा अंक लें :-) –