2011-12-29 12 views
7

में फोन मैं इस कोड के व्यवहार के बारे कुछ संदेह मिलती है:dispatch_sync एक dispatch_async कॉल

dispatch_async(queue, ^{ 
    sleep(2); 
    NSLog(@"step1"); 

    dispatch_sync(queue, ^{ 
     sleep(3); 
     NSLog(@"step 2"); 
    }); 

    NSLog(@"step 3"); 
}); 

इन पंक्तियों मैं उत्पादन step1 -> step3 -> step2 के रूप में मिलने की उम्मीद से, लेकिन मैं केवल step1 प्राप्त करते हैं।

यदि मैं dispatch_sync को dispatch_async के साथ बदलता हूं तो यह अपेक्षित कार्य करता है, क्या dispatch_sync एक dispatch_async कॉल में इस तरह की समस्या पैदा करता है?

जवाब के बाद संपादित करें ----------------

इस मामले में एक गतिरोध बनाने के लिए:

आप देख सकते हैं स्वीकार किए जाते हैं जवाब इस स्थिति की व्याख्या करने के लिए और प्रलेखन के लिए इस लिंक को जांचें http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_async.3.html

उत्तर

21

यह एक डेडलॉक है।

dispatch_sync कॉल queue जब तक इंतजार कर रहे होंगे अपने ब्लॉक चल रहा है और लौटने से पहले उपलब्ध है, लेकिन है कि उपलब्ध है जब तक dispatch_async तो यह सिर्फ वहाँ बैठेंगे dispatch_sync कॉल करने के लिए इंतजार कर रहे कताई समाप्त हो गया है नहीं होगा।

1

जैसा कि @ mattjgalloway द्वारा उल्लिखित है, यह एक डेडलॉक है।

ऐप्पल के स्वयं के दस्तावेज में समस्या का उल्लेख है: http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_async.3.html (देखें "रिकॉर्सी लॉक")। यह पुनरावर्ती ताले के संदर्भ में चर्चा की जाती है, लेकिन सिद्धांत एक जैसा है।

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