你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS dispatch_sync(dispatch_get_main_queue(), ^{ });死鎖原因

iOS dispatch_sync(dispatch_get_main_queue(), ^{ });死鎖原因

編輯:IOS開發綜合

1:

- (void)viewDidLoad {

//dispatch_sync(dispatch_get_main_queue(), ^{
//NSLog(@3);
//死鎖原因
//1:dispatch_sync在等待block語句執行完成,而block語句需要在主線程裡執行,所以dispatch_sync如果在主線程調用就會造成死鎖
//2:dispatch_sync是同步的,本身就會阻塞當前線程,也即主線程。而又往主線程裡塞進去一個block,所以就會發生死鎖。
//});
//dispatch_async(dispatch_get_global_queue(), ^{
//async 在主線程中 創建了一個異步線程 加入 全局並發隊列,async 不會等待block 執行完成,立即返回

NSLog(@2);//不會造成死鎖;

});

}

分析這段代碼:view DidLoad 在主線程中,也即dispatch_get_main_queue()中,執行到sync時向dispatch_get_main_queue()插入同步thread,sync會等到後面的block執行完成才返回。sync又在主隊列裡面,是個串行隊列,sync是後面才加入的,前面一個是主線程,所以sync想執行block必須等待前一個主線程執行完成,而主線程卻

在等待sync返回,去執行後續工作,從而造成死鎖。

2:

dispatch_sync 和 dispatch_async 區別:

dispatch_async(queue,block) async 異步隊列,dispatch_async 函數會立即返回, block會在後台異步執行。
dispatch_sync(queue,block) sync 同步隊列,dispatch_sync 函數不會立即返回,即阻塞當前線程,等待 block同步執行完成。

3:

 

GCD Queue 分為三種:

1,The main queue :主隊列,主線程就是在個隊列中。

2,Global queues : 全局並發隊列。

3,用戶隊列:是用函數 dispatch_queue_create 創建的自定義隊列


 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved