美文网首页
使用GCD导致线程死锁

使用GCD导致线程死锁

作者: 廖燊 | 来源:发表于2020-04-24 09:53 被阅读0次

GCD简单介绍

同步任务: dispatch_sync 任务,不具备开启线程的能力

异步任务:dispatch_async 任务,具备开启线程的能力

串行队列:一个任务执行完才能执行下个队列任务,例如主队列 dispatch_get_main_queue()

并行队列:可以多个任务同时执行,例如全局队列dispatch_get_global_queue(0, 0)

自己创建的队列:并发队列 dispatch_queue_create("myquee", DISPATCH_QUEUE_CONCURRENT); 

串行队列:dispatch_queue_create("myquee", DISPATCH_QUEUE_SERIAL);

想队列中添加任务,导致死锁问题解析,因为死锁只发生在同步任务 sync中,这里异步任务就不做多余的解释。

导致死锁的原因:线程间任务相互等待,例如:

- (void)viewDidLoad {

    [super viewDidLoad]; 

    //执行的任务1

    dispatch_sync(dispatch_get_main_queue(), ^{

        //执行的任务2

    });

    //执行的任务3

}

主线程中开启同步任务,将任务添加到主队列中,由于主队列是由上到下执行的,这个时候将串行任务添加到主队列中,导致阻塞,

任务1执行完,串行执行任务2,

任务2需要等待任务3执行完后再执行,

任务3在等待任务2执行完才会开始执行,

线程间相互等待导致死锁

PS:死锁只发生再同一个队列中,添加同步串行队列才会发生。分别向不同队列中添加,任务是不会造成死锁的。

相关文章

  • GCD线程死锁

    GCD简化了多线程的使用,但使用不当会导致线程死锁。 dispatch_async(queue,block) a...

  • 使用GCD导致线程死锁

    GCD简单介绍 同步任务:dispatch_sync 任务,不具备开启线程的能力 异步任务:dispatch_as...

  • 同步串行导致的死锁问题

    GCD中同步操作dispatch_sync()中队列使用主队列会导致线程死锁,是众所周知的事情。但是是如何造成死锁...

  • iOS基础篇-GCD死锁

    GCD死锁概念: 使用GCD多线程编程时,如果同步函数dispatch_sync(),目标queue为当前queu...

  • iOS GCD-主线程同步执行死锁问题

    出自:huazhume 在使用GCD的过程中,会遇到许多线程死锁的问题,会导致程序循环等待,然后直到奔溃。下来我们...

  • GCD同步阻塞原理

    GCD因为功能强大,操作简便,成为苹果官方推荐使用的多线程API。然而GCD也难只要逃涉及多线程就会遇到的死锁问题...

  • 带你分分钟了解GCD多线程的死锁

    带你了解GCD多线程的死锁 阐述: 1.什么是GCD? GCD,全称 Grand Central Dispatch...

  • GCD 细细的读

    目录 前言 为什么选择GCD? 串行队列、并行队列、同步、异步 线程死锁解析 DispatchQueue的使用 D...

  • 死锁 GCD 多线程

    死锁 GCD 多线程 Ios - LDSmallCat - 博客园 Ios中GCD死锁困扰很多人,分享一点个人经...

  • iOS多线程2

    1.线程的状态: 2.GCD 注意: 不能再主线程中再次滴啊用同步行数并且把任务添加到主队列,会导致线程死锁 3....

网友评论

      本文标题:使用GCD导致线程死锁

      本文链接:https://www.haomeiwen.com/subject/tyrxwhtx.html