首先,我们来看下下面一个例子:

代码:(串行队列里同步线程嵌套)

    NSLog(@"haha");

    dispatch_queue_t queue = dispatch_queue_create("test", nil);

    dispatch_sync(queue, ^ {

        NSLog(@"xxoo0");

        dispatch_sync(queue, ^ {

            NSLog(@"xxoo1");

        });

        NSLog(@"xxoo2");

    });

运行结果:



2014-08-25 14:30:24.440 test[4424:60b] haha

2014-08-25 14:30:24.441 test[4424:60b] xxoo0



在test串行队列中,有两个同步线程嵌套导致第二个同步线程运行不了,产生了死锁。

原因是:在串行队列中,第二个同步线程要执行,必须等待第一个同步线程执行完成后才可进行,但是第一个同步线程要执行完又得等待第二个同步线程执行完,因为第二个同步线程嵌套在第一个同步线程里,这就造成了两个同步线程互相等待,即死锁。

特别强调:是在串行队列里!





    dispatch_queue_t queue = dispatch_queue_create("test", nil);

这行代码中,第二个参数为nil值,相当与值为DISPATCH_QUEUE_SERIAL,即为串行的。如果把值改成DISPATCH_QUEUE_CONCURRENT,即为并行的,就不会导致两个同步线程死锁。或者使用dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)也行,因为dispatch_get_global_queue是并行队列。



ok,我们来看第二个例子:



代码:(主线程里的同步线程)



    NSLog(@"haha");

    dispatch_sync(dispatch_get_main_queue(), ^ {

        NSLog(@"xxoo");

    });

运行结果:



2014-08-25 15:01:58.922 test[4797:60b] haha



结果还是死锁,这个例子其实和第一个例子是类似的,主线程其实就是在一个串行队列里的,我们写的这个同步线程就相当与第一个例子的第二个嵌套的同步线程,因为这个同步线程是在主线程里写的,就相当于嵌套在主线程里的。



所以,对于

dispatch_sync(queue, ^{});

这行代码的意义可以概括为: 会阻塞当前线程等待串行queue中的所有任务执行完成后再向下执行。

关于dispatch_sync死锁问题的更多相关文章

  1. 【读书笔记】iOS-GCD-API

    一,Dispatch Queue dispatch_async(queue, ^{ /* *想执行的任务 */ }); 其中queue分为两种: 1,Serial Dispatch Queue 等待现 ...

  2. 第3月第19天 cxx_destruct dispatch_get_main_queue()死锁

    1. http://blog.jobbole.com/65028/ 2. - (void)viewDidLoad { [super viewDidLoad]; NSLog("); dispa ...

  3. GCD死锁 多线程

    NSLog("); dispatch_sync(dispatch_get_main_queue(), ^{ // sync同步 main串行 // 同步,异步--线程 同步-主线程 // m ...

  4. iOS gcd dispatch使用注意,dispatch_syn可能产生的死锁

      我们在使用dispatch_sync 时可能会出现死锁,看下面的例子: import UIKit class ViewController: UIViewController { var seri ...

  5. GCD中的dispatch_sync、dispatch_sync 分别与串行、并行队列组合执行小实验

    平常开发中会经常用gcd做一下多线程任务,但一直没有对同步.异步任务在串行.并行队列的执行情况做个全面的认识,今天写了个demo跑了下,还是有些新发现的. 代码如下: - (void)touchesB ...

  6. dispatch_sync may result in dead-lock

    以下代码会引起死锁 dispatch_block_t block = ^{ ; i < ; i++) { NSLog(@"dispatch_sync:%d", i); } } ...

  7. dispatch_async & dispatch_sync

    Clear that! dispatch_async 是将block发送到指定线程去执行,当前线程不会等待,会继续向下执行. dispatch_sync 也是将block发送到指定的线程去执行,但是当 ...

  8. iOS学习笔记-死锁deadlock理解

    1.首先看一下官方文档的解释,这个block的队列是同步执行的,不像异步,这个方法直到block执行完毕才会返回 2.主线程一旦开启,就要先把自己的代码执行完成之后,才去执行加入到主队列中的任务 De ...

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

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

随机推荐

  1. C++程序中调用WebService的实现

    前言 因为最近的项目中需要运用到在MFC程序中调用WebService里面集成好了的函数,所以特意花了一天的时间来研究WebService的构建以及如何在MFC的程序中添加Web引用,进而来实现在C+ ...

  2. volley框架下发送和读取cookie

    首先volley本身不支持cookie,但是volley又非常好用(比如封装了网络请求的实现,内部支持并发, 不用我们再额外设计网络管理异步处理,网络请求不应在UI线程等等),那既想使用volley又 ...

  3. Jquery 如何获取表单中的全部元素的值

    1.使用var formData = $(formId).serialize()获取:获取数据的格式为url参数形式的字符串.例如:id=100&name=张三   2.服务器端使用parse ...

  4. 【虚拟机-可用性集】ARM 中可用性集使用的注意事项

    Azure 目前有两种部署模型:经典部署模型 (ASM) 和资源管理器 (ARM).如果您之前使用过 ASM 模式下的可用性集,那么很可能在使用 ARM 模式下的可用性集时,会遇到一些问题或者疑惑.这 ...

  5. 一键部署WordPress开源内容管理系统

    https://market.azure.cn/Vhd/Show?vhdId=9857&version=10889 产品详情 产品介绍WordPress是一款个人博客系统,并逐步演化成一款内容 ...

  6. 家校通Code

    9 http://dlwt.csdn.net/fd.php?i=621573845033702&s=44d46a459acce7fef39aa4dcff51bfba

  7. Android(java)学习笔记129:对ListView等列表组件中数据进行增、删、改操作

    1. ListView介绍 解决大量的相似的数据显示问题 采用了MVC模式: M: model (数据模型) V:  view  (显示的视图) C: controller 控制器 入门案例: aci ...

  8. PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep

    PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...

  9. CPP-STL:vector中的size和capacity

    在vector中与size()和capacity() 相对应的有两个函数: resize(size_type)和reserve(size_type). Size指目前容器中实际有多少元素,对应的res ...

  10. C 语言设计坦克大战(未完成)

    //坦克大战 //0.提示界面 //1.边框 //2.指定位置显示自己的坦克 //3.己方坦克随着方向键动起来 //getasynkeustae //Sleep(毫秒) //减少闪烁 //不闪烁Set ...