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在主队列中,而打印任务在自定义的串行队列中,所以没有死锁。

以上便是本人的一些理解,至于其他的死锁情况感觉都大同小异。









原创粉丝点击