10

के साथ लॉक रीड-लिप लॉक मेरा आवेदन जीसीडी का भारी उपयोग करता है, और लगभग सब कुछ प्रेषण द्वारा संभाले गए छोटे कार्यों में विभाजित होता है। हालांकि, अंतर्निहित डेटा मॉडल ज्यादातर पढ़ा जाता है और केवल कभी-कभी लिखा जाता है।जीसीडी

मैं वर्तमान में पढ़ने के दौरान महत्वपूर्ण डेटा संरचनाओं में परिवर्तनों को रोकने के लिए ताले का उपयोग करता हूं। लेकिन आज कुछ और ताले में देखने के बाद, मुझे एनएससीन्डिशन लॉक और कुछ पेज रीड-राइट लॉक के बारे में मिला। उत्तरार्द्ध बिल्कुल वही है जो मुझे चाहिए।

मुझे यह कार्यान्वयन मिला: http://cocoaheads.byu.edu/wiki/locks। मेरा सवाल है, क्या यह कार्यान्वयन जीसीडी के साथ काम करेगा, यह देखते हुए कि यह पीटीएचड का उपयोग करता है?

उत्तर

20

यह अभी भी काम करेगा। pthreads थ्रेडिंग एपीआई है जो मैक ओएस एक्स पर अन्य सभी थ्रेड-एपीआई एपीआई का पालन करता है। (इसके तहत मैक थ्रेड एक्टिवेशंस है, लेकिन यह एसपीआई है, एपीआई नहीं।) वैसे भी, pthreads ताले के लिए वास्तव में आवश्यकता नहीं है कि आप pthreads का उपयोग करें धागे।

हालांकि, जीसीडी आईओएस 5: dispatch_barrier_async() के रूप में बेहतर विकल्प प्रदान करता है। असल में, आपके पास एक निजी समवर्ती कतार है। आप इसे सामान्य रूप से सभी पढ़ने के लिए प्रस्तुत करते हैं। आप बाधा दिनचर्या का उपयोग कर इसे लिखने के लिए ऑपरेशन जमा करते हैं। टा-दा! रीड-राइट लॉकिंग।

यदि आपके पास WWDC 2011 session video for Session 210 - Mastering Grand Central Dispatch तक पहुंच है तो आप इसके बारे में अधिक जान सकते हैं।

+1

आह, मैंने बाधाओं के बारे में पढ़ा था, लेकिन उस समय एक व्यावहारिक अनुप्रयोग के बारे में नहीं सोचना था (मैंने शायद ही कभी मल्टीथ्रेडिंग का उपयोग किया) और उनके बारे में सब भूल गए। धन्यवाद, मैं यह देखने की कोशिश करूंगा कि क्या मैं इसका उपयोग कर सकता हूं! –

+3

माइक ऐश भी जीसीडी का उपयोग कर पाठक-लेखक सिंक्रनाइज़ेशन को पूरा करने का एक अच्छा उदाहरण प्रदान करता है। http://www.mikeash.com/pyblog/friday-qa-2011-10-14-whats-new-in-gcd.html –

1

आप सभी पढ़ने/लिखने के संचालन के लिए एक सीरियल कतार बनाए रखने पर भी विचार करना चाहेंगे। इसके बाद आप यह सुनिश्चित करने के लिए dispatch_sync() उस कतार में लिख सकते हैं कि डेटा मॉडल में परिवर्तन तत्काल लागू होते हैं और dispatch_async() यह सुनिश्चित करने के लिए सभी पढ़ते हैं कि आप ऐप में अच्छा प्रदर्शन बनाए रखते हैं।

चूंकि आपके पास एक एकल धारावाहिक कतार है जिस पर सभी पढ़ और लिखते हैं, आप सुनिश्चित करते हैं कि लिखने के दौरान कोई भी पाठ नहीं हो सकता है। यह लॉक से बहुत कम महंगा है लेकिन इसका मतलब है कि आप एक साथ कई 'पठन' संचालन निष्पादित नहीं कर सकते हैं। अधिकांश अनुप्रयोगों के लिए समस्या का कारण बनने की संभावना नहीं है।

dispatch_barrier_async() का उपयोग करने का अर्थ यह हो सकता है कि लिखते हैं कि आप वास्तव में प्रतिबद्ध होने के लिए मनमाने ढंग से समय लेते हैं क्योंकि कतार में सभी पूर्व-मौजूदा कार्यों को आपके बाधा ब्लॉक निष्पादन से पहले पूरा करना होगा।

+0

हम्म, मुझे यह भी एहसास नहीं हुआ कि सीरियल कतार पर एसिंक प्रेषण संभव था। यह एक दिलचस्प विचार की तरह लगता है ... सभी पढ़ना उचित रूप से छोटे संपादन होते हैं, हालांकि आमतौर पर लिखना, संपादन करना और फिर डेटा को फिर से सहेजना है। –

+5

आमतौर पर, आप यहां सुझाए गए सुझावों के विपरीत करते हैं। आमतौर पर पढ़ने को सिंक्रनाइज़ेशन जमा करना होता है, क्योंकि आपको कॉलर पर लौटने से पहले परिणाम प्राप्त करने की आवश्यकता होती है। लेखन अतुल्यकालिक रूप से किया जा सकता है, क्योंकि कॉलर केवल इस बात की परवाह करता है कि बाहर से देखे जाने वाले राज्य को लिखित तिथि के अनुरूप है, क्योंकि ऐसा इसलिए है क्योंकि लेखन पूरा होने तक कोई पढ़ाई नहीं हो सकती क्योंकि कतार धारावाहिक है। जैसा कि उल्लेख किया गया है, कई पाठकों के साथ मदद नहीं करता है। –

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