5

मैं एक संपत्ति @property NSLock *myLockएक विशिष्ट थ्रेड

है पर एक NSLock लॉक करने के लिए कैसे और मैं दो तरीकों लिखना चाहते हैं:

- (void) lock 

और

- (void) unlock 

इन विधियों ताला और myLock अनलॉक क्रमशः और उन्हें इस बात की परवाह किए बिना कि उन्हें क्या थ्रेड या कतार कहा जाता है। उदाहरण के लिए, थ्रेड ए ने lock कहा होगा लेकिन कतार बी unlock पर कॉल कर सकता है। इन दोनों विधियों को रिपोर्टिंग के बिना उचित रूप से काम करना चाहिए कि मैं इसे लॉक किए गए एक अलग थ्रेड/कतार से लॉक अनलॉक करने का प्रयास कर रहा हूं। इसके अतिरिक्त, उन्हें यह समकालिक रूप से करने की आवश्यकता है।

उत्तर

23

यह दुर्लभ है कि 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 की अत्यधिक अनुशंसा करता हूं।

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