美文网首页
iOS GCD主队列中添加同步任务卡死 dispatch_get

iOS GCD主队列中添加同步任务卡死 dispatch_get

作者: 低音区 | 来源:发表于2020-08-04 18:11 被阅读0次

关于这个问题,查了很多资料。总是没有找到满意的答案。总是云里雾里的,在讲一些概念级别的术语。设置很多约束的情况下,推理出答案。不是很满意。自己总结了一下,猜想了一个比较认可的答案。

问题描述:
使用GCD,给主队列添加同步任务。会引起崩溃。

参考资料:iOS中主队列的同/异步执行

//声明全局队列。
@property (nonatomic, strong)dispatch_queue_t queue;

//调用全局队列,添加同步任务。
- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_sync(self.queue, ^{
        [self testMainThreadAndSync];
        NSLog(@"同步队列+并发任务");
    });
}

//任务未完成之前,再次添加同步任务。
- (void)testMainThreadAndSync{
    dispatch_sync(self.queue, ^{//报错Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
        [self syncFunction];
        NSLog(@"同步队列+并发任务");
        NSLog(@"当前线程:%@",[NSThread currentThread]);
    });
}
//定义一个方法
- (void)syncFunction{
    NSLog(@"同步方法");
}
//队列初始化方法。
- (dispatch_queue_t)queue{
    if(!_queue){
        _queue = dispatch_queue_create("like.mainQueue", DISPATCH_QUEUE_SERIAL);
    }
    return _queue;
}

思路:
创建串行队列,在同步任务 testMainThreadAndSync 执行过程中,添加同步任务 syncFunction。导致程序崩溃
得出结论:
串行队列在同步任务执行中的时候,添加新的同步任务,会导致两个任务相互等待。导致线程卡死。
主队列也是一个特殊的串行队列,由此我得出的答案是,每一个在主队列中调用的方法,都会被当做同步任务处理。而这个时候,我们的同步任务添加操作,又在主队列的同步任务中完成。导致线程卡死。

图示:

任务等待导致线程卡死

OK~ 这就是我得出的答案。

相关文章

  • iOS GCD主队列中添加同步任务卡死 dispatch_get

    关于这个问题,查了很多资料。总是没有找到满意的答案。总是云里雾里的,在讲一些概念级别的术语。设置很多约束的情况下,...

  • 多线程

    iOS中的几种多线程GCD1、GCD分为任务和队列,任务(同步,异步)队列(串行,并发),同步串行,同步主队列的情...

  • iOS 多线程之GCD

    GCD核心概念 任务 :执行的操作 队列 :执行任务的等待队列 任务 同步执行 :同步添加任务到指定的队列中,如果...

  • iOS开发多线程之GCD

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 GCD...

  • GCD线程死锁

    GCD 以下情况下会死锁,(不考虑线程锁的情况下) 主队列中同步添加任务。 串行队列任务中添加同步任务 为什么呢?...

  • CGD相关知识

    GCD队列总体分为同步队列和异步队列两种,添加到同步队列中的任务,根据添加的顺序挨个执行,添加到异步队列里面的任务...

  • iOS开发之GCD并发队列

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 03 ...

  • 关于dispatch_barrier_async和dispatc

    在iOS多线程中,我们可以用GCD的串行队列来实现同步锁的效果。通过在把任务添加到串行队列中来依次执行,达到同步的...

  • iOS开发之GCD同步任务加强

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 004...

  • iOS开发之GCD串行队列

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 实例d...

网友评论

      本文标题:iOS GCD主队列中添加同步任务卡死 dispatch_get

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