2013-04-08 9 views
5

मुझे लगता है कि इस सवाल पूछने के लिए सबसे अच्छा तरीका है कुछ कोड के साथ है:उद्देश्य-सी में ग्रैंड सेंट्रल डिस्पैच के साथ किस व्यवहार की गारंटी है?

//Main method 
for(int i = 0; i < 10; i++) 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     [self foo:i]; 
    }); 

} 

- (void) foo: (int) i 
{ 
    @synchronized(self) 
    { 
     NSLog(@"%d",i); 
    } 
} 

इस मामले में, यह गारंटी है कि संख्या 0-9 क्रम में मुद्रित हो जाएगा? क्या कभी ऐसा मौका है कि रन कतार में इंतजार कर रहे धागे में से एक को छोड़ दिया जाएगा? वास्तविकता में कैसे। वास्तव में, क्या ऐसा कभी होता है? क्या होगा यदि मैं उपरोक्त व्यवहार चाहता था (अभी भी धागे का उपयोग कर रहा हूं); मैं इसे कैसे पूरा कर सकता हूं?

+0

थ्रेड और जीसीडी ब्लॉक "छोड़ दिया" नहीं मिलता है। यदि कोई थ्रेड अपवाद फेंकता है, तो आप बिना किसी स्पष्ट प्रयास के कभी नहीं जानते क्योंकि जीसीडी अपवाद हैंडलिंग का त्याग करता है। – CodaFi

उत्तर

15

इस मामले में, क्या यह गारंटी है कि 0-9 संख्या को मुद्रित किया जाएगा?

सं

वहाँ कभी एक मौका है कि धागे कि रन कतार पर प्रतीक्षा कर रहा है में से एक, आप छोड़ दिया जाएगा है?

अस्पष्ट "क्या छोड़ दिया" मतलब है। अगर इसका मतलब है "क्या ब्लॉक क्रम में निष्पादित किए जाएंगे?" जवाब "शायद है, लेकिन यह एक कार्यान्वयन विस्तार है"।

वास्तविकता में कैसे। वास्तव में, क्या ऐसा कभी होता है?

अप्रासंगिक। यदि आप यथार्थवादी कार्यान्वयन विवरणों के बारे में धारणाओं के आधार पर समवर्ती कोड लिख रहे हैं, तो आप गलत समरूपता कोड लिख रहे हैं।

क्या होगा अगर मैं उपरोक्त व्यवहार (अभी भी धागे का उपयोग कर रहा था); मैं कैसे इसे पूरा कर सकता हूं?

एक धारावाहिक प्रेषण कतार बनाएं और उस कतार में प्रेषण करें जिस क्रम में आपको निष्पादित करने की आवश्यकता है। ध्यान दें कि यह @synchronized() से काफी तेज़ है (बेशक, @synchronized() आपके लिए भी काम नहीं करेगा, यह आदेश की गारंटी नहीं देता है, लेकिन केवल विशिष्टता)।

+0

क्या आप कृपया समझा सकते हैं, क्यों नहीं? ऐप्पल दस्तावेज़ों से: "समवर्ती कतार (जिसे वैश्विक प्रेषण कतार के रूप में भी जाना जाता है) एक या एक से अधिक कार्यों को एक साथ निष्पादित करता है, लेकिन कार्य अभी भी उस क्रम में शुरू किए गए हैं जिसमें उन्हें कतार में जोड़ा गया था।" इसका मतलब यह नहीं है कि आदेश पूरा हो जाएगा? –

+7

वे जोड़े गए क्रम में शुरू किए जाएंगे, लेकिन थ्रेड शेड्यूलिंग का अर्थ यह हो सकता है कि वे उसी क्रम में निष्पादन पूर्ण नहीं करते हैं। –

+0

इसे मिला, धन्यवाद! –

0

dispatch_get_global_queue

ब्लाकों के प्रलेखन से इन वैश्विक समवर्ती कतारों को प्रस्तुत एक दूसरे के लिए सम्मान के साथ समवर्ती क्रियान्वित किया जा सकता है।

तो इसका मतलब है कि वहां कुछ भी गारंटी नहीं है। आप कतार में कोड का एक ब्लॉक पारित कर रहे हैं और कतार इसे वहां से ले जाती है।

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

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