GCD之死锁体会

简介:

1.先看下几句代码



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.再看如下代码:



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则等待主线程队列执行完毕添加到主线程队列中,这样就死锁了。



相关文章
|
7月前
|
Python
Python多线程中递归锁如何解决死锁问题的详细阐述
Python多线程中递归锁如何解决死锁问题的详细阐述
|
8月前
|
C语言
C语言中如何避免循环死循环
C语言中如何避免循环死循环
360 1
|
8月前
|
算法 安全
死锁相关知识点以及银行家算法(解题详细步骤)
死锁相关知识点以及银行家算法(解题详细步骤)
361 2
|
数据采集 算法 安全
深入探究进程、线程和协程:并发编程的三重境界
深入探究进程、线程和协程:并发编程的三重境界
|
安全
什么是死锁?(把死锁给大家讲明白,知道是什么,为什么用,怎么用)
什么是死锁?(把死锁给大家讲明白,知道是什么,为什么用,怎么用)
96 0
什么是死锁?(把死锁给大家讲明白,知道是什么,为什么用,怎么用)
|
存储 关系型数据库 MySQL
面试官:解释下什么是死锁?为什么会发生死锁?怎么避免死锁?
开局先来个段子: 面试官: 解释下什么是死锁? 应聘者: 你录用我,我就告诉你 面试官: 你告诉我,我就录用你 应聘者: 你录用我,我就告诉你 面试官: 滚!
深入理解JUC:第五章:CyclicBarrier循环栅栏
深入理解JUC:第五章:CyclicBarrier循环栅栏
121 0
深入理解JUC:第五章:CyclicBarrier循环栅栏
|
网络协议 测试技术 Go
协程求素数的思路分析 | 学习笔记
快速学习协程求素数的思路分析
协程求素数的思路分析 | 学习笔记
|
Java
【Java多线程】写一个死锁的例子
【Java多线程】写一个死锁的例子
116 0
|
Arthas NoSQL Java
如何避免死锁?我们有套路可循
如何避免死锁?我们有套路可循
如何避免死锁?我们有套路可循