यह दुर्लभ है कि NSLock
नौकरी के लिए सही उपकरण है। अब बहुत बेहतर उपकरण, खासकर जीसीडी के साथ; और बाद में।
आप शायद पहले से ही the docs से जानते हैं, लेकिन मैं साथ पढ़ने वालों के लिए दोहराने की आवश्यकता होगी:
चेतावनी: NSLock वर्ग POSIX धागे का उपयोग करता है अपने ताला व्यवहार लागू करने के लिए। एक NSLock ऑब्जेक्ट को अनलॉक संदेश भेजते समय, आपको यह सुनिश्चित करना होगा कि संदेश उसी थ्रेड से भेजा गया है जिसने प्रारंभिक लॉक संदेश भेजा था। एक अलग थ्रेड से लॉक अनलॉक करने के परिणामस्वरूप अपरिभाषित व्यवहार हो सकता है।
यदि आप अलग-अलग धागे को लॉक और अनलॉक करने का प्रयास कर रहे हैं तो डेडलॉकिंग के बिना इसे लागू करना बहुत मुश्किल है। मौलिक समस्या यह है कि यदि lock
धागे को अवरुद्ध करता है, तो उस थ्रेड पर चलने वाले unlock
के लिए कोई रास्ता नहीं है, और आप unlock
को किसी भिन्न थ्रेड पर नहीं देख सकते हैं। NSLock
इस समस्या के लिए नहीं है।
NSLock
की बजाय, आप dispatch_semaphore_create()
के साथ समान पैटर्न लागू कर सकते हैं। इन्हें आपके पसंदीदा थ्रेड पर सुरक्षित रूप से अपडेट किया जा सकता है। आप dispatch_semaphore_wait()
का उपयोग कर लॉक कर सकते हैं और आप dispatch_semaphore_signal()
का उपयोग करके अनलॉक कर सकते हैं। उस ने कहा, यह अभी भी आमतौर पर सही उत्तर नहीं है।
अधिकांश संसाधन विवाद एक ऑपरेशन कतार या प्रेषण कतार के साथ सबसे अच्छा प्रबंधित किया जाता है। ये समानांतर में काम को संभालने, संसाधनों का प्रबंधन करने, घटनाओं पर इंतजार करने, निर्माता/उपभोक्ता पैटर्न को लागू करने, और अन्यथा लगभग NSLock
या NSThread
के साथ किए गए लगभग हर चीज को करने के उत्कृष्ट तरीके प्रदान करते हैं। मैं ताले के बजाए कतारों के साथ डिजाइन करने के तरीके के परिचय के रूप में Concurrency Programming Guide की अत्यधिक अनुशंसा करता हूं।
स्रोत
2013-04-11 15:24:37