国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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

永遠等著。。。。。

 知道原理就不會出錯了

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汉阴县| 讷河市| 肇东市| 儋州市| 玛纳斯县| 陇西县| 凌海市| 榕江县| 绥中县| 辽宁省| 昂仁县| 滨州市| 平阴县| 湟源县| 阆中市| 渝中区| 永善县| 都匀市| 雷州市| 玉环县| 施甸县| 沙田区| 邳州市| 同德县| 梓潼县| 中阳县| 华宁县| 沂南县| 宜宾市| 邵东县| 西宁市| 长乐市| 密山市| 视频| 镇原县| 博野县| 塔河县| 二连浩特市| 垣曲县| 科技| 佛山市|