2011-10-12 11 views
11

एक कोको NSLocking वस्तु (एक NSLock की तरह) और कुछ गैर तुच्छ कोड को देखते हुए निष्पादित किया जाना है:क्या NSLocking उपयोग हमेशा @ try/@ में लपेटा जाना चाहिए? जबकि ताला आयोजित किया जाता है

सुनिश्चित करने के लिए एक ताला हमेशा जारी किया गया है, तो निम्न मुहावरा हमेशा इस्तेमाल किया जाना चाहिए?

NSLock *mutex = // get lock from somewhere 
@try { 
    [mutex lock]; 
    // do non-trivial stuff 
} 
@finally { 
    [mutex unlock]; 
} 

यह समझदार (और जावा में आम) लगता है, लेकिन मैंने कोई कोको कोड ऐसा नहीं देखा है।

क्या यह मुहावरे इस्तेमाल किया जाना चाहिए? क्यों या क्यों नहीं?

उत्तर

4

यह सुनिश्चित करने के लिए कि लॉक हमेशा जारी किया जाता है, क्या निम्नलिखित मुहावरे का हमेशा उपयोग किया जाना चाहिए?

हां, जहां उस दायरे ('गैर-तुच्छ सामग्री') के बाद प्रोग्राम की शुद्धता की आवश्यकता होती है, और यह मानते हुए कि आपका प्रोग्राम उन अपवादों से ठीक से ठीक हो सकता है।

क्या इस मुहावरे का उपयोग किया जाना चाहिए? क्यों या क्यों नहीं?

यदि आप पुनर्प्राप्त कर सकते हैं, तो हाँ, अनलॉकिंग सामान्य रूप से निष्पादन जारी रखने के लिए आवश्यक है। अन्यथा, आपका प्रोग्राम अमान्य स्थिति में निष्पादित होगा।

  • उदाहरण 1: जब ताला (dealloc के दौरान) नष्ट हो जाता है, प्रयास को नष्ट करने की है क्योंकि यह अभी तक बंद है यह असफल हो जायेगी। क्या कार्यान्वयन लॉक को नष्ट करना जारी रखता है या अनदेखा करता है त्रुटि को परिभाषित नहीं किया जाता है (मैं अनुमान यह जारी रखेगा, जिसका अर्थ है कि यह कभी भी dealloc से बाहर नहीं निकलेगा)।

  • उदाहरण 2: जब इसे किसी अन्य धागे से लॉक किया जाता है (या एक ही थ्रेड, अगर पुनर्वित्त नहीं होता है) तो आप कभी भी लॉक प्राप्त नहीं करेंगे और परिणामस्वरूप किसी अन्य त्रुटि, डेडलॉक या अपवाद का उत्पादन किया जा सकता है। एक कार्यान्वयन भी (अंततः) लॉक अधिग्रहण के साथ आगे बढ़ सकता है। गारंटी दी गई सभी को लॉग इन करना है जब त्रुटि मिली है।

pthread_mutex तों और कार्यान्वयन कि उन पर निर्भर बहुत सुन्दरता अगर आप इस तरह के एक ताला असंतुलन ही व्यवहार नहीं कर सकते; यह हमेशा प्रोग्रामर त्रुटि पर वापस आ जाता है।

शुद्ध ओबीजेसी और सी में सही और रक्षात्मक लॉकिंग बहुत सुंदर नहीं है। जावा मुहावरे सही है, और फाउंडेशन एपीआई के लिए समान रूप से लागू है। कारण यह नहीं है कि आप इसे कर सकते हैं क्योंकि अपवाद कोको एपीआई और जावा (जावा की तुलना में) पर निर्भर करते हुए कम लोकप्रिय/प्रयुक्त त्रुटि हैंडलिंग तंत्र हैं। टिप्पणियां

+3

एक बात उल्लेखनीय है कि कोको में अपवाद की प्रकृति जब अन्य भाषाओं/पुस्तकालयों की तुलना में बल्कि अजीब है। कोको अपवाद (अधिकांश भाग के लिए) स्थितियों में, जहां समस्या अपवाद संचालकों के बिना प्रोग्राम के रूप में रोका जा सकते थे में उठाए गए हैं (उदाहरण के लिएसरणी तत्व पढ़ने से पहले सीमाओं का परीक्षण करके सीमाओं से बाहर) या समस्या शायद ही पुनर्प्राप्त करने योग्य है (उदाहरण के लिए अमान्य चयनकर्ता ऑब्जेक्ट को भेजा गया है, या विंडो सर्वर से कनेक्शन खो गया है)। –

+0

@ बेवारियस हां, अच्छा बिंदु - हम एक ही समय में टाइप कर रहे थे (जब आप अपनी टिप्पणी लिखते थे तो मैं जवाब अपडेट/विस्तार कर रहा था)। – justin

3

सं

अपवाद केवल कोको में प्रोग्रामिंग त्रुटियों के लिए उपयोग किया जाता है में भी Bavarious 'टिप्पणी देखें। उन परिस्थितियों के लिए उनका उपयोग नहीं किया जाता है जहां कार्यक्रम को पुनर्प्राप्त करने की उम्मीद है।

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