मेरे पास उद्देश्य-सी में थ्रेड सुरक्षा के बारे में कोई प्रश्न है। मैंने कुछ अन्य उत्तरों को पढ़ा है, कुछ ऐप्पल दस्तावेज, और अभी भी इसके बारे में कुछ संदेह हैं, इसलिए सोचा कि मैं अपना खुद का प्रश्न पूछूंगा।किसी ऑब्जेक्ट को एकाधिक धागे से एक्सेस करने से लॉक करना - उद्देश्य-सी
मेरा प्रश्न तीन गुना है:
मान लीजिए मैं एक सरणी, NSMutableArray *myAwesomeArray;
फोल्ड 1 है:
अब मुझे ठीक कर लें मैं गलत हूँ, लेकिन से मैं क्या समझ , @synchronized(myAwesomeArray){...}
का उपयोग करके दो थ्रेड को कोड के उसी ब्लॉक तक पहुंचने से रोक दिया जाएगा।
-(void)doSomething {
@synchronized(myAwesomeArray) {
//some read/write operation on myAwesomeArray
}
}
तो, दो धागे ही समय में ही विधि एक्सेस करते हैं, कोड की है कि ब्लॉक सुरक्षित थ्रेड किया जाएगा: तो, मूल रूप से, अगर मैं कुछ इस तरह की है। मुझे लगता है कि मैं इस भाग को ठीक से समझ गया हूं।
फोल्ड 2:
अगर myAwesomeArray
अलग अलग तरीकों से एक से अधिक थ्रेड द्वारा पहुँचा जा रहा है तो मैं क्या करूँ? अगर मैं की तरह कुछ है:
- (void)readFromArrayAccessedByThreadOne {
//thread 1 reads from myAwesomeArray
}
- (void)writeToArrayAccessedByThreadTwo {
//thread 2 writes to myAwesomeArray
}
अब, दोनों तरीकों एक ही समय में दो अलग-अलग धागे द्वारा पहुँचा रहे हैं। मैं कैसे सुनिश्चित करूं कि myAwesomeArray
में कोई समस्या नहीं होगी? क्या मैं NSLock या NSRecursiveLock जैसे कुछ उपयोग करता हूं?
फोल्ड 3:
अब, ऊपर दो मामलों में, myAwesomeArray
स्मृति में एक इवर था। अगर मेरे पास डेटाबेस फ़ाइल है, तो मैं हमेशा स्मृति में नहीं रहता हूं। जब भी मैं डेटाबेस ऑपरेशंस करना चाहता हूं, तो मैं databaseManagerInstance
बना देता हूं, और इसे पूरा करने के बाद इसे छोड़ देता हूं। इस प्रकार, मूल रूप से, विभिन्न वर्ग डेटाबेस तक पहुंच सकते हैं। प्रत्येक वर्ग DatabaseManger
का अपना उदाहरण बनाता है, लेकिन मूल रूप से, वे सभी एक ही, एकल डेटाबेस फ़ाइल का उपयोग कर रहे हैं। मैं कैसे सुनिश्चित करूं कि ऐसी स्थिति में दौड़ की स्थिति के कारण डेटा दूषित नहीं हुआ है?
इससे मुझे अपने कुछ बुनियादी सिद्धांतों को स्पष्ट करने में मदद मिलेगी।
'@ synchronize' एक ही चर है कि आप बंद कर दिया है, नहीं कोड की है कि विशिष्ट ब्लॉक तक पहुँचने से अन्य धागे से बचाता है। –
आह। समझा। खैर, मुझे लगता है कि @synchronize निर्देश के बारे में जो कुछ मैंने समझा था उसके बारे में थोड़ा और कुछ था। धन्यवाद! : डी – codeBearer
@codeBearer मैंने http://stackoverflow.com/a/15393623/412916 किंडा पर आपके प्रश्न का उत्तर दिया। – Jano