GCD死锁的一点点理解
来源:互联网 发布:燃气管网优化现状 编辑:程序博客网 时间:2024/05/28 05:19
首先说明一下线程和队列的关系,线程说白了就是代码的执行路径,队列是管理任务的。两者之间的关系就是,线程会去队列中取出任务来执行。
然后解释一下队列的类型和任务执行的方式,队列是一种先进先出(FIFO)的数据结构,它有两种常用的类型,一种是串行队列,任务是排成一条队来执行的;另外一种是并行队列,有多条伍来执行。任务执行的方式主要有两种,一种是同步,执行任务的线程要等此任务执行完成过后才能执行下面的任务,另外一种异步,线程不用等待任务的完成可以继续往下执行。
接下来切入正题死锁:
先看看常见的死锁:
dispatch_queue_t queue = dispatch_get_main_queue();dispatch_sync(queue, ^{ NSLog(@"test"); }
这里的意思是向串行队列中同步添加一个打印任务,先说明死锁的原因是循环等待,而造成循环等待原因才是最为重要的,首先主队列是串行队列,首先向主队列中添加dispatch_sync{}同步线程这个任务,然后把block中的打印任务同步添加到主队列中,这时主队列中有两个任务,一个是dispatch_sync,另外一个是打印任务,dispatch_sync这个任务要等到block执行完成才算执行完毕,而打印任务是排在这个任务后面的,意思就是要等dispatch_sync执行完毕过后才能执行打印任务,所以造成了死锁。
有了上面的基本死锁介绍,再看看下面几句代码:
dispatch_queue_t searial_queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL);dispatch_sync(searial_queue, ^{ NSLog(@"test"); });
这里同样是向串行队列中同步添加任务但没有死锁,原因在于dispatch_sync在主队列中,而打印任务在自定义的串行队列中,所以没有死锁。
以上便是本人的一些理解,至于其他的死锁情况感觉都大同小异。
阅读全文
0 0
- GCD死锁的一点点理解
- GCD死锁的理解
- 理解GCD死锁
- GCD的死锁
- GCD的队列,死锁
- Enum的一点点理解
- 一点点指针的理解
- maven的一点点的理解
- 关于GCD中同步函数+主队列产生死锁的一点理解
- 对jsp的一点点理解
- 一点点arm bootloader的理解
- 关于latch的一点点理解
- 有关KMP的一点点理解
- 对指针的一点点理解
- 对static的一点点理解
- 对Thrift的一点点理解
- 对Thrift的一点点理解
- 对Dijkstra的一点点理解。
- Intellij IDEA Cannot resolve symbol XXX 问题解决办法汇总
- 51 nod 1486 大大走格子(容斥原理)
- Android provider冲突问题,ImagePick的provider与自己的provider冲突
- fresco 加载本地gif图片
- iOS开发
- GCD死锁的一点点理解
- PHP 表单验证
- Chunky Monkey 猴子吃香蕉, 分割数组
- 浮动元素引起的问题和解决办法?
- BigDecimal 使用方法详解
- 《Java编程思想》测试数据
- 9月第四周
- 第二章、对象及变量的并发访问 之 synchronized 同步方法(2)
- js 对象克隆