2011-12-29 158 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_async更改dispatch_sync,它的工作方式與預期的一樣,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將不可用。