GCD中的線程死結問題,gcd線程死結

來源:互聯網
上載者:User

GCD中的線程死結問題,gcd線程死結

GCD 確實好用 ,很強大,相比NSOpretion 無法提供 取消任務的功能。

如此強大的工具用不好可能會出現線程死結。 如下代碼:

- (void)viewDidLoad{    [super viewDidLoad];    NSLog(@"=================4");    dispatch_sync(dispatch_get_main_queue(), ^{        NSLog(@"=================5");    });    NSLog(@"=================6");}

GCD Queue 分為三種:

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

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

3,使用者隊列:是用函數 dispatch_queue_create 建立的自訂隊列

 

dispatch_sync 和  dispatch_async 區別:

dispatch_async(queue,block)  async 非同步隊列,dispatch_async 函數會立即返回, block會在後台非同步執行。

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

 

分析上面代碼:

viewDidLoad 在主線程中, 及在
dispatch_get_main_queue() 中,執行到sync 時 向
dispatch_get_main_queue()插入 同步 threed1.

sync 會等到 後面block 執行完成才返回, sync 又再 dispatch_get_main_queue() 隊列中,
它是串列隊列,sync 是後加入的,前一個是主線程,
所以 sync 想執行 block 必須等待主線程執行完成,主線程等待 sync 返回,去執行後續內容。

照成死結,sync 等待mainThread 執行完成, mianThread 等待sync 函數返回。

下面例子:
- (void)viewDidLoad{    [super viewDidLoad];    dispatch_async(dispatch_get_global_queue(0, 0), ^{        NSLog(@"=================1");        dispatch_sync(dispatch_get_main_queue(), ^{        NSLog(@"=================2");    });    NSLog(@"=================3");    });
}

 

程式會完成執行,為什麼不會出現死結。

首先: async 在主線程中  建立了一個非同步線程 加入  全域並發隊列,async 不會等待block 執行完成,立即返回,

1,async 立即返回, viewDidLoad 執行完畢,及主線程執行完畢。 
2,同時,全域並發隊列立即執行非同步 block , 列印 1, 當執行到 sync 它會等待 block 執行完成才返回, 及等待
dispatch_get_main_queue() 隊列中的 mianThread 執行完成, 然後才開始調用block 。

因為1 和 2 幾乎同時執行,因為2 在全域並發隊列上, 2 中執行到sync 時 1 可能已經執行完成或 等了一會,mainThread 很快退出, 2 等已執行後續內容。

如果阻塞了主線程,2 中的sync 就無法執行啦,mainThread 永遠不會退出, sync 就永遠等待著,

- (void)viewDidLoad{    [super viewDidLoad];
dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"=================1"); dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"=================2"); }); NSLog(@"=================3"); }); NSLog(@"==========阻塞主線程"); while (1) { } NSLog(@"========2==阻塞主線程");}

列印如下:

2014-11-30 17:56:22.296 Test[6108:379350] =================1

2014-11-30 17:56:22.296 Test[6108:379231] ==========阻塞主線程

永遠等著。。。。。

 知道原理就不會出錯了

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.