美文网首页
使用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导致线程死锁

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