19

आईओएस में मल्टीथ्रेडिंग का सबसे अच्छा तरीका क्या है क्योंकि हमारे पास तीन विकल्प जीसीडी, NSThread, और NSOperationQueue हैं? मैं उलझन में हूं कि कौन सा सबसे अच्छा है? यदि कोई नहीं है, तो किस परिदृश्य में उपयोग किया जाना चाहिए और वे कैसे भिन्न होते हैं और अगर किसी के पास NSOperationQueue का उपयोग करने का कुछ अच्छा उदाहरण है, तो कृपया साझा करें ताकि मैं सीख सकूं।जीसीडी, एनएसटीएचड या एनएसओपरेशन क्यूई का सबसे अच्छा कौन सा है?

+1

"सर्वश्रेष्ठ" परिभाषित करें। उपयोग करने के लिए सबसे तेज़, हल्का, सबसे आसान? – CodaFi

+0

यह एक अप्रत्याशित प्रश्न है जब तक कि आपके मन में विशिष्ट उपयोग केस न हो। तीनों में से कोई सामान्य "सर्वश्रेष्ठ" नहीं है। – jrturton

उत्तर

35

सरल जवाब:

  1. उपयोग NSThread (या यहां तक ​​pthreads एपीआई) जब आप चाहते हैं या धागे आप बनाते हैं, जैसे पर सीधा नियंत्रण की आवश्यकता है आपको थ्रेड प्राथमिकताओं पर बढ़िया नियंत्रण की आवश्यकता है या कुछ अन्य उपप्रणाली के साथ इंटरफेसिंग कर रहे हैं जो सीधे थ्रेड ऑब्जेक्ट्स को वेंड/खपत करते हैं और आपको इसके साथ उसी पृष्ठ पर रहने की आवश्यकता होती है। ऐसे उदाहरण दुर्लभ हैं, लेकिन वे विशेष रूप से रीयल-टाइम अनुप्रयोगों में होते हैं।

  2. जब आपका कार्य सरल समांतरता के लिए स्वयं को उधार देता है तो जीसीडी का उपयोग करें, उदा। आप बहुत कम अतिरिक्त काम के साथ "पृष्ठभूमि में" कुछ काम करना चाहते हैं, आपके पास कुछ डेटा संरचनाएं हैं जिन्हें आप केवल एक्सेस को क्रमबद्ध करना चाहते हैं (और सीरियल कतार लॉकलेस फैशन में ऐसा करने के लिए बहुत अच्छे हैं), आपके पास कुछ है लूप जो dispatch_apply() के साथ समांतरता के लिए खुद को उधार देगा, आपके पास कुछ डेटा स्रोत/टाइमर हैं जो जीसीडी के स्रोत एपीआई आपको पृष्ठभूमि में आसानी से निपटने में सक्षम बनाएंगे आदि। जीसीडी काफी शक्तिशाली है और आप इसे बहुत उपयोग कर सकते हैं इससे भी अधिक, लेकिन ये सभी रिश्तेदार 'नो ब्रेनर' परिदृश्य हैं जहां आप प्रारंभिकरण और सेटअप कार्यों में पकड़े नहीं जाना चाहते हैं, जैसे कि "समानांतर में मूलभूत सामग्री"।

  3. जब आप पहले से ही कोको एपीआई परत (सीधे सी में पीओएसआईक्स एपीआई में लिख रहे हैं) में एनएसओपरेशन का उपयोग करें और अधिक जटिल संचालन जिन्हें आप समांतर करना चाहते हैं। NSOperation subclassing, मनमाने ढंग से जटिल निर्भरता ग्राफ, रद्दीकरण और कई अन्य उच्च स्तरीय अर्थशास्त्र का समर्थन करता है जो आपके लिए उपयोगी हो सकता है। एनएसओपरेशन वास्तव में कवर के तहत जीसीडी का उपयोग करता है, इसलिए यह जीसीडी के रूप में सक्षम बहु-कोर, मल्टी-थ्रेड के रूप में हर बिट है, हालांकि यह सवारी के लिए फाउंडेशन फ्रेमवर्क भी लाता है, इसलिए यदि आप पॉज़िक्स परत पर हैकिंग कर रहे हैं, तो शायद आप इसका उपयोग करना चाहते हैं विकल्प 2।

के रूप में अन्य लोगों ने कहा, हालांकि, यह सब आप क्या प्रयास कर रहे हैं पर निर्भर करता है तो वहाँ अपने प्रश्न का कोई भी या यहाँ तक कि सार्वभौमिक सही जवाब है।

+1

KUdos, ... @ jkh ...... यही वह है जिसे मैं जानना चाहता था। अब, कोई ऐसा व्यक्ति है जिसके साथ मैं चर्चा करता हूं। ठीक है, तो आपने पॉइंट 2 के बारे में कहा है, मैं वर्तमान में 2 का उपयोग कर रहा हूं। लेकिन, मैं सोच रहा था कि अगर किसी अन्य थ्रेड या कतार द्वारा लिया गया समय के आधार पर रनटाइम पर थ्रेड की प्राथमिकता निर्धारित कर सकती है। मान लीजिए, एक थ्रेड 3 मिनट से अधिक समय ले रहा है, मैं इसकी प्राथमिकता को कम करना चाहता हूं और दूसरी प्राथमिकता को बढ़ा देना चाहता हूं। – Sumitiscreative

+0

इसके अलावा, जैसा कि हमारे पास आईओएस में dispatch_global कतार है, जो प्रकृति द्वारा समवर्ती हैं। जब हम इसे कोड के ब्लॉक को असाइन करते हैं, तो क्या यह एक नई कस्टम समवर्ती कतार बनाने और इसमें ब्लॉक जोड़ने से बेहतर है ??? या यह वही ??? क्या हम इन कतारों की प्राथमिकता निर्धारित कर सकते हैं जो हम बनाते हैं ??? – Sumitiscreative

+2

धागे की प्राथमिकता को सेट करने से पहले, पूछने वाला पहला सवाल है "क्यों?"मैंने रीयल-टाइम एप्लिकेशन (उदाहरण के लिए ऑडियो, वीडियो प्रसंस्करण) को ऐसा करने का प्राथमिक कारण बताया है क्योंकि अन्यथा ऐसा करने की आवश्यकता दुर्लभ है। जीसीडी वैश्विक समवर्ती कतारों (पृष्ठभूमि, निम्न, मध्यम, उच्च) जो लगभग हमेशा किसी एप्लिकेशन की ज़रूरतों के लिए पर्याप्त होते हैं। यदि थ्रेड को पूरा करने में 3 मिनट लगते हैं, तो प्राथमिकता सेटिंग करने में मदद नहीं मिलेगी - या तो इसे छोटे कार्यों में तोड़ दें या बस ओएस को गतिशील रूप से लंबे समय से चलने वाले धागे बनाम प्राथमिकताओं को सेट करें -टेरम (और यह होगा) – jkh

0

मैं हाल ही में NSOperationQueue की ओर झुका रहा हूं। यह आंतरिक रूप से जीसीडी का उपयोग करता है और धागा सुरक्षित है, साथ ही उपयोग करने के लिए बहुत आसान है।

+0

लेकिन कोई तर्क दे सकता है कि एनएसओपरेशनक्यूयू को कुचलने के लिए यह निश्चित रूप से तेज़ होगा, और बस जीसीडी स्तर पर उतर जाएगा। – CodaFi

+0

NSOperationQueue सबसे अच्छा काम करता है जब कार्य अलग-अलग होते हैं, सिंक्रोनस होते हैं और एक ही धागे में रहते हैं (उदाहरण के लिए वे कम या ज्यादा परमाणु हैं), कतार का उपयोग मूल थ्रेड पूल के रूप में किया जा सकता है हालांकि लगभग किसी भी स्थिति में। –