1.先看下几句代码

1
2
3
4
5
6
7
dispatch_queue_t serialqueue=dispatch_queue_create("serialqueue", DISPATCH_QUEUE_SERIAL);//串行线程队列
    dispatch_sync(serialqueue, ^{
        NSLog(@"1");
    });
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"2");
    });

2.前面博文写了GCD之死锁http://www.cnblogs.com/cuiyw/p/4369041.html写了这样一句:防死锁秘籍:不要在串行队列放dispatch_sync、dispatch_apply,这几天一直想着这句话,今天看用户自定义线程队列时,看到串行线程队列,所以就想着验证着句话是否正确,以为像上面那样写,两个都会死锁,运行了下发现并不像想象当中的那样。第一个能够输出,这让我大吃一惊,以为这句话难道不正确是错误的?有看了下同步异步,并敲代码体会了一下,发现是自己理解错误。

3.dispatch_sync、dispatch_apply这些都有体现同步。同步是阻塞当前线程,把参数中的block语句添加到参数中的线程队列中执行,待执行完毕后,返回阻塞的地方继续执行。

比如上面的两个同步:

第一个:当前运行的是主线程队列,mian queue,运行到dispatch_sync 时,主线程挂起,开始将block添加到自定义的串行线程队列中,待执行完毕后返回到当前主线程队列main queue。所以并不会产生死锁。

第二个:当前主线程执行到第二个同步时,阻塞,开始将block添加到主线程队列中,此时主线程队列等待block执行,而block这边等待主线程队列执行完,这样就产生了死锁。

4.再看如下代码:

1
2
3
4
5
6
7
8
9
10
dispatch_sync(queue,^{
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"1");
        });
   });
   dispatch_sync(queue,^{
       dispatch_sync(dispatch_get_main_queue(), ^{
           NSLog(@"2");
       });
   });

上面两部分代码第一个不会死锁,而第二个会死锁。

个人分析理解,不一定正确。

第一个:主线程是串口线程队列,执行到sync的时候阻塞主线程队列,将block添加到全局线程队列中,全局线程队列开启一个线程,以异步的方式将最里面的block添加到主线程串口队列中,并返回,此时可以返回到原来阻塞的位置。

第二个:主线程执行到sync的时候阻塞主线程队列,将block添加到全局线程队列中,采用同步阻塞全局线程队列将最里面的block添加到主线程队列中,而此时主线程队列阻塞等待block的返回,而block则等待主线程队列执行完毕添加到主线程队列中,这样就死锁了。

最新文章

  1. [Android]Dagger2Metrics - 测量DI图表初始化的性能(翻译)
  2. 使用shell/python获取hostname/fqdn释疑
  3. Ajax概要:
  4. 84 tune2fs-调整系统参数
  5. iOS开发——UI基础-UIScrollView
  6. Linux下使用popen()执行shell命令
  7. springmvc----struts2比较
  8. HDU5874:Friends and Enemies
  9. OpenWrt固件刷入后串口终端没有反应的问题
  10. DevExpress控件使用系列--ASPxTreeList
  11. 自己写的一个分页控件类(WinForm)
  12. Meteor:用户账号管理添加密码和微博weibo账号系统支持
  13. jQuery Ajax 实例 ($.ajax、$.post、$.get)【转载】
  14. PHP中用到的一些字符串函数
  15. Neutron Router 工作原理 - 每天5分钟玩转 OpenStack(142)
  16. Linux 压缩解压及备份命令
  17. 老李分享:android app自动化测试工具合集
  18. vue 导出xlsx表功能
  19. 2019年桌面Linux需要做好的7件事
  20. 查找所有sphinx引擎表并生成创建表的语句

热门文章

  1. Win7怎么把运行添加到Win快捷菜单的右侧、、、
  2. Yii2 报错Getting unknown property: app\models\Product::
  3. 【Linux】CentOS7无法使用tab补全功能
  4. 浅谈服务器对SEO的影响,该如何选择服务器?
  5. 高效使用 Python 可视化工具 Matplotlib
  6. python 爬取天猫美的评论数据
  7. jenkins+ant+jmeter接口自动化测试(持续构建)
  8. Intellj IDEA常用快捷键
  9. Retrofit2.0源码解析
  10. JRE 和 JDK 的区别