博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS GCD 死锁理解
阅读量:5923 次
发布时间:2019-06-19

本文共 1703 字,大约阅读时间需要 5 分钟。

hot3.png

同步(dispatch_sync):

dispatch_sync(fcQueue, ^{     NSLog(@"1"); // 任务 1 }); NSLog(@"2");  // 任务 2dispatch_sync(fcQueue, ^{     NSLog(@"3"); // 任务 3 }); NSLog(@"4"); // 任务 4

输出:“1234”。

异步(dispatch_async):

dispatch_async(serialQueue, ^{     NSLog(@"1"); //任务 1 }); NSLog(@"2"); dispatch_async(serialQueue, ^{     NSLog(@"3"); //任务 3 }); NSLog(@"4");

上面代码执行结果可能为 “1234”、“1243”、“2134”、“2143”、“2413”中的一种,2 始终在 4 前面,1 始终在 3 前面,2 始终在 3 前面。

死锁

NSLog(@"1"); // 任务1dispatch_sync(dispatch_get_main_queue(), ^{     NSLog(@"2"); // 任务2});NSLog(@"3"); // 任务3

输出: 1。

输入图片说明

如图所示,代码中dispatch_sync(dispatch_get_main_queue(), ^{ });会获取主线程(当前线程)阻塞之,执行完任务1就不会继续走任务2,它会把任务2放到任务3后面,等到任务2执行完才会打通阻塞的地方继续执行,可是任务2不可能执行完,因为主线程已经堵住了~

Go on

NSLog(@"1"); // 任务1dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{     NSLog(@"2"); // 任务2});NSLog(@"3"); // 任务3

输出: 1 2 3。

输入图片说明

Go on

dispatch_queue_t queue = dispatch_queue_create("com.fcDemo.serialQueue", DISPATCH_QUEUE_SERIAL);NSLog(@"1"); // 任务1dispatch_async(queue, ^{    NSLog(@"2"); // 任务2    dispatch_sync(queue, ^{        NSLog(@"3"); // 任务3    });    NSLog(@"4"); // 任务4});NSLog(@"5"); // 任务5

输出:1 5 2 或 1 2 5 。

Go on

NSLog(@"1"); // 任务1dispatch_async(dispatch_get_global_queue(0, 0), ^{    NSLog(@"2"); // 任务2    dispatch_sync(dispatch_get_main_queue(), ^{        NSLog(@"3"); // 任务3    });    NSLog(@"4"); // 任务4});NSLog(@"5"); // 任务5

输出: 12534或15234。

Go on

dispatch_async(dispatch_get_global_queue(0, 0), ^{    NSLog(@"1"); // 任务1    dispatch_sync(dispatch_get_main_queue(), ^{        NSLog(@"2"); // 任务2    });    NSLog(@"3"); // 任务3});NSLog(@"4"); // 任务4while (1) {}NSLog(@"5"); // 任务5

输出:14或41。

不同线程可以执行不同队列的任务

转载于:https://my.oschina.net/jlongtian/blog/875705

你可能感兴趣的文章
通过源码解析 Node.js 中一个 HTTP 请求到响应的历程
查看>>
CodeIgniter的密码处理论
查看>>
Spring Cloud Config服务器
查看>>
测试人员必学的软件快速测试方法(二)
查看>>
Agora iOS SDK-快速入门
查看>>
引入间接隔离变化(三)
查看>>
统一沟通-技巧-4-让国内域名提供商“提供”SRV记录
查看>>
cocos2d-x 3.0事件机制及用户输入
查看>>
比亚迪速锐F3专用夏季座套 夏天坐垫 四季坐套
查看>>
C++ 数字转换为string类型
查看>>
程序员全国不同地区,微信(面试 招聘)群。
查看>>
【干货】界面控件DevExtreme视频教程大汇总!
查看>>
闭包 !if(){}.call()
查看>>
python MySQLdb安装和使用
查看>>
Java小细节
查看>>
poj - 1860 Currency Exchange
查看>>
chgrp命令
查看>>
Java集合框架GS Collections具体解释
查看>>
洛谷 P2486 BZOJ 2243 [SDOI2011]染色
查看>>
linux 笔记本的温度提示
查看>>