麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

GCD中的線程死鎖問題

2019-11-14 17:58:10
字體:
來源:轉載
供稿:網友

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] ==========阻塞主線程

永遠等著。。。。。

 知道原理就不會出錯了

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美精品一区二区三区四区 | 91精品国产99久久久久久 | 黄色毛片一级视频 | 悠悠成人资源亚洲一区二区 | 99在线热视频 | 久久毛片| 91精品观看91久久久久久国产 | 黄色特级一级片 | 羞羞网站视频 | 海角在线观看91一区二区 | 欧美国产第一页 | 成人三级电影网址 | 我爱我色成人网 | 午夜视频观看 | 久久影院国产精品 | 色羞羞 | 国产永久免费观看 | 亚洲99| 国产小视频在线观看 | 国产流白浆高潮在线观看 | 91成人免费版 | 一区在线视频 | 2021狠狠操 | 日韩av在线播放一区 | 国产成人精品视频在线 | 国产一级爱c视频 | 久久久久久艹 | 国产理论视频在线观看 | 羞羞的小视频 | av手机在线免费播放 | 日韩中字在线 | 黄色网址在线视频 | 9797色| 久久久久久久久日本理论电影 | 欧美人xx| 亚洲精品无码不卡在线播放he | 色中色在线播放 | 久久久久国产成人精品亚洲午夜 | 久草最新网址 | 免费观看一级欧美大 | 欧美成人精品一区二区三区 |