iOS GCD常見的死鎖問題之一

iOS GCD常見的死鎖問題之一

GCD面試常問的死鎖問題

問:打印的結果是什麼?

結果:1,因為執行到這個同步線程這裡就死鎖了;

結果:1,3,2 ;因為dispatch_async()被放到了主隊列的末尾執行,即結束了viewDidLoad 主隊列中的內容才執行這個;

首先,無論是同步sync還是異步async 都是調用一個block,這個block會被放到指定的隊列(queue)的隊尾等待執行;至於block中是並行執行還是串行執行那就和dispatch_sync中的參數指定的queue是並行還是串行有關;不同的是sync地等到block有結果了才能進行下一步操作也就是nslog(@"3");而async不需要,可以和nslog(@"3")同時執行;

同步(sync) 操作,它會阻塞當前線程並等待 Block 中的任務執行完畢,然後當前線程才會繼續往下運行;

異步(async)操作,它不會阻塞當前的線程,會一起執行任務;

viewDidLoad操作是由上到下一步一步往下執行的,dispatch_sync提交一個打印任務NSLog(@”2”)到主線程關聯的串行隊列中,主線程關聯的串行隊列現在有一個viewDidLoad任務,打印任務NSLog(@”2”)排在viewDidLoad後面,隊列FIFO(先進先出)的原則,打印任務NSLog(@”2”);想要得到執行必須等到viewDidLoad執行完畢後才能得到執行,但是viewDidLoad想要執行完畢必須要等打印任務NSLog(@”2”)執行完畢,所以就卡死在這了。

iOS GCD常見的死鎖問題之一


分享到:


相關文章: