關於GCD中同步函數+主隊列產生死鎖的一點理解
阿新 • • 發佈:2019-02-20
tar 理解 特點 執行 art current star 當前 關於
首先看個產生死鎖的代碼
-(void)syncMain{
//獲得主隊列
dispatch_queue_t queue = dispatch_get_main_queue();
NSLog(@"start");
//同步函數
dispatch_sync(queue, ^{
NSLog(@"------ %@",[NSThread currentThread]);
});
NSLog(@"end");
}
上述代碼中是不會執行到 NSLog(@”end”) 將 end 打印出來的, 當然,再開一條線程來執行syncMain是不會產生死鎖
原因解釋
同步函數與主隊列的特點
同步函數 dispatch_sync : 立刻執行,並且必須等這個函數執行完才能往下執行
主隊列特點:凡是放到主隊列中的任務,都會放到主線程中執行..如果主隊列發現當前主線程有任務在執行,那麽主隊列會暫停調度隊列中的任務,直到主線程空閑為止
綜合同步函數與主隊列各自的特點,不難發現為何會產生死鎖的現象,主線程在執行同步函數的時候主隊列也暫停調度任務,而同步函數沒有執行完就沒法往下執行…簡陋的解決辦法,上文提到.要麽不這麽用.
關於GCD中同步函數+主隊列產生死鎖的一點理解