(iOS)關於GCD死鎖的問題


- (void)viewDidLoad { [super viewDidLoad]; dispatch_sync(dispatch_get_main_queue(), ^{NSLog(@"111");}); NSLog(@"222"); }
此時主線程已經是死鎖狀態,不會打印222和111。 主線程執行到dispatch_sync時,它會阻塞主線程, 直到主隊列完成dispatch_sync中的任務(便是這裏的NSLog(@"111")), 但主隊列要完成dispatch_sync中的任務,就要先完成以前的任務(即viewDidLoad中的全部代碼需先執行完才能執行dispatch_sync中的代碼,由於隊列是FIFO(先入先出),而viewDidLoad是比dispatch_sync中的任務先入主隊列的),所以致使了死鎖的狀況。這裏 能夠改用dispatch_async就能解決問題。

即便使用dispatch_async實現並行隊列(異步執行),隊列也是按照FIFO順序執行,仍需等待。除非新建另外一個隊列執行任務。異步

相關文章
相關標籤/搜索