- (void)viewDidLoad {
[super viewDidLoad];
[self sync];
}
- (void)sync {
dispatch_queue_t queue = dispatch_get_main_queue();
NSLog(@"Thread--%@", [NSThread currentThread]);
dispatch_sync(queue, ^{
NSLog(@"sync1--%@", [NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"sync2--%@", [NSThread currentThread]);
dispatch_sync(queue, ^{
});
dispatch_sync(queue, ^{
NSLog(@"sync3--%@", [NSThread currentThread]);
});
}
- 以上代碼會造成死鎖,原因是viewDidLoad函數會在主線程執行,當主線程中有任務在執行時,主隊列內的任務會被阻塞。當代碼執行到dispatch_sync時,會將block內的代碼放入主隊列。因為主隊列被viewDidload阻塞了,所以block不會被執行。而dispatch_sync是同步函數,需要block執行完畢后才會返回,所以viewDidload和block相互阻塞,形成死鎖。
- 如果將同步函數隊列換成其他的其他隊列,無論是串行隊列還是并行隊列都不會造成死鎖。因為viewDidload被block阻塞時,block和viewDidload不在同一隊列,block不會被viewDidload阻塞,當block自行完畢后viewDidload也會繼續執行。
- 所以GCD的死鎖和線程無關,是因為隊列的阻塞造成了任務的相互阻塞才形成死鎖。如果兩個任務不在同一隊列內就不會造成死鎖。
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。