1. 程式人生 > >GCD dispatch_sync同步引起死鎖的問題

GCD dispatch_sync同步引起死鎖的問題


截圖中可以看到程式執行到主執行緒同步執行時出現崩潰,下面來分析一下崩潰原因:

首先了解一下dispatch_sync:

第一個引數 queue 為佇列物件,第二個引數block為block物件。這個介面是同步將block扔到佇列queue中去執行,即扔了我就等著,等到queue排隊把這個block執行完之後,才繼續執行下一行程式碼。

首先明確的是:執行這個dispatch_get_main_queue佇列的是主執行緒。執行了dispatch_sync函式後,將block新增到了main_queue中,同時呼叫dispatch_syn這個函式的執行緒(也就是主執行緒)被阻塞,等待block執行完成,而執行主執行緒佇列任務的執行緒正是主執行緒,此時他處於阻塞狀態,所以block永遠不會被執行,因此主執行緒一直處於阻塞狀態。因此這段程式碼執行後,並非卡在block中無法返回,而是根本無法執行到這個block