dispatch_sync执行了两件事:把代码块放入指定线程的任务队列中、堵塞当前线程直到代码块执行结束,如果出现了堵塞的线程和代码块所在的线程为同一线程的话,这个时候代码无法在此线程执行继续下去,即造成了死锁。

- (void)viewDidLoad {
[super viewDidLoad];
dispatch_sync(dispatch_get_main_queue(), ^{
//这里在等B处代码执行结束再执行
NSLog(@"MrYu4");
});
//B:等代码块执行结束再执行
}

额外挑战

下面代码中是否出现死锁?

- (void)viewDidLoad {
[super viewDidLoad];
dispatch_queue_t myQueue = dispatch_queue_create("com.MrYu4.queue", 0);
dispatch_sync(myQueue, ^{
dispatch_sync(dispatch_get_main_queue(), ^{
[self updateLabelWhenBackgroundDone];
});
});
}

解析

如下面注释所示,C处、D处代码永远不可能执行到,换个理解方式,也可以说myQueue要执行结束需要等待主线程执行完毕,但主线程执行又要等待myQueue执行完毕

如何理解粗体字?实际上死锁发生的时候主线程顺序上有两个代码块:Z和B,在Z中出现的dispatch_sync(myQueue...堵塞了Z往下接着执行,更别提接着往下执行到B了(主线程是串行线程)

- (void)viewDidLoad {
//Z:主线程中的代码块
[super viewDidLoad];
dispatch_queue_t myQueue = dispatch_queue_create("com.MrYu4.queue", 0);
dispatch_sync(myQueue, ^{//A:堵塞当前线程(主线程),将代码块放入myQueue线程的任务队列中
dispatch_sync(dispatch_get_main_queue(), ^{//B:堵塞当前线程(myQueue),讲代码块放入主线程的任务队列中
NSLog(@"MrYu4");
});
//C:等待B代码块执行结束再执行
});
//D:等待A代码块执行结束再执行
}

[一句话说iOS]dispatch如何造成死锁的更多相关文章

  1. (iOS)关于GCD死锁的问题

    - (void)viewDidLoad { [super viewDidLoad]; dispatch_sync(dispatch_get_main_queue(), ^{NSLog("); ...

  2. 用几句话说一说CMake add_dependencies & target_link_libraries的使用区别

    简单说一说前两天学习使用CMake解决链接问题时遇到的一个问题. 对于编译时遇到的依赖问题,很多时候我们只需要一句target_link_libraries就可以搞定. 但是CMake还有另外一个co ...

  3. 三句话说清楚ssh端口转发

    看了下自己以前的笔记发现也没有完全搞清楚, 网上好多文章都是抄来抄去,远程端口转发全都是拿127.0.0.1举例 总结了下,三句话就可以讲清楚了   1 ssh本地端口转发是 把ssh服务器可以访问到 ...

  4. 用一两句话说一下你对“盒模型”这个概念的理解,和它都涉及到哪些css属性

    网页设计中常听的属性名:内容(content).填充(padding).边框(border).边界(margin), CSS盒子模式都具备这些属性. 这些属性我们可以用日常生活中的常见事物——盒子作一 ...

  5. 五个案例让你明白GCD死锁(转)

    转自:http://ios.jobbole.com/82622/ 死锁一直都是在使用多线程时,需要注意的一个问题.以前对同步.异步,串行.并行只有一个模糊的概念,想想也是时候整理一下了.再看看之前的博 ...

  6. iOS开发之"省市"二级联动的数据组织(PHP版)以及PickerView的实现与封装

    之所以要发表这篇博客,还源于最近的开发工作所实现的一个小的Demo, 当然这个Demo不会涉及工作中App的一些内容,下方要实现的Demo是通用的.因为项目需求的迭代,要求在银行卡绑定中添加支行所在的 ...

  7. IOS学习笔记之 Socket 编程

    最近开始静心学习IOS编程,虽然起步有点晚,但有句话说的好:“如果想去做,任何时候都不晚”.所以在今天,开始好好学习IOS.(本人之前4年都是搞.Net的,java也培训过一年) 打算学IOS,从哪入 ...

  8. IOS中nil/Nil/NULL的区别

    类与对象的概念 类是对同一类事物高度的抽象,类中定义了这一类对象所应具有的静态属性(属性)和动态属性(方法). 对象是类的一个实例,是一个具体的事物. 类与对象是抽象与具体的关系. 类其实就是一种数据 ...

  9. IOS中类和对象还有,nil/Nil/NULL的区别

    转自:http://blog.sina.com.cn/s/blog_5fb39f910101akm1.html 类与对象的概念 类是对同一类事物高度的抽象,类中定义了这一类对象所应具有的静态属性(属性 ...

  10. ios绘图时的坐标处理

    在iOS中,进行绘图操作时,一般主要是在UIView:drawRect中调用 UIGraphicsBeginImageContextWithOptions等一系列函数,有时候直接画图就行,比如UIIm ...

随机推荐

  1. 02、Linux 排查

    Linux 分析排查 1.敏感文件信息 1.1.tmp 目录 /tmp:临时目录文件,每个用户都可以对它进行读写操作.因此一个普通用户可以对 /tmp 目录执行读写操作(ls -alt) 筛查 /tm ...

  2. 6、Samba 文件共享服务

    1.Samba 服务基础 SMB(Server Message Block),服务消息块 CIFS(Common Internet File System),通用互联网文件系统 Samba 项目:ht ...

  3. 大数据面试SQL每日一题系列:最高峰同时在线主播人数。字节,快手等大厂高频面试题

    大数据面试SQL每日一题系列:最高峰同时在线主播人数.字节,快手等大厂高频面试题 之后会不定期更新每日一题sql系列. SQL面试题每日一题系列内容均来自于网络以及实际使用情况收集,如有雷同,纯属巧合 ...

  4. Oracle用户创建、赋权、查询及删除操作

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...

  5. IPv6 — 子网划分

    目录 文章目录 目录 前文列表 IPv6 的子网划分 前文列表 <IPv6 - 网际协议第 6 版> <IPv6 - 地址格式与寻址模式> <IPv6 - 协议头> ...

  6. 【力扣-TS解题】1、回文数

    给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false . 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 例如,121 是回文,而 123 不是 来源 ...

  7. 表单设计——《HTML5 CSS3从入门到精通》

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 一文带你了解.NET能做什么?

    前言 在DotNetGuide技术社区微信交流群经常看到有小伙伴问:.NET除了能写桌面应用和Web应用还能做什么?今天大姚将通过本篇文章来简单讲讲.NET能做哪些开发,对.NET感兴趣的小伙伴也可以 ...

  9. 部署Zabbix

    https://blog.csdn.net/qq_57414752/article/details/125819822

  10. Vue cli之在组件中使用axios

    默认情况下,我们的项目中并没有对axios包的支持,所以我们需要下载安装. 在项目根目录中使用 npm安装包: npm install axios 接着在main.js文件中,导入axios并把axi ...