美文网首页
GCD:dispatch_sync会在当前线程中执行派发到其他队

GCD:dispatch_sync会在当前线程中执行派发到其他队

作者: 开发者老岳 | 来源:发表于2018-03-12 23:18 被阅读27次

dispatch_sync的官方文档中有这么一句话:

As an optimization, this function invokes the block on the current thread when possible.

意思是作为优化手段,如果可以,block会直接在当前线程中执行。

然后写了几段代码测试了下:

dispatch_async(_myQueue1, ^{  
  
    NSLog(@"1 start!");  
    sleep(1);  
    NSLog(@"1 stop!");  
  
    dispatch_async(_myQueue2, ^{  
        NSLog(@"2 start!");  
        sleep(2);  
        NSLog(@"2 stop!");  
    });  
  
    dispatch_sync(_myQueue2, ^{  
        NSLog(@"3 start!");  
        sleep(1);  
        NSLog(@"3 stop!");  
    });  
});
  

如果_myQueue1,_myQueue2都是自己创建的队列,那3确实是与1在同一线程中执行,2在另外一个线程中执行。但是3虽然与2不在一个线程中,但是由于在同一队列里,所以依然要等待2执行完才能执行3,当前线程会被阻塞知道2、3都执行完。

如果令_myQueue1 = dispatch_get_main_queue(),_myQueue2是自己创建的队列,3就会在主线程中执行。也就是说在主线程中调用dispatch_sync往子线程派发任务,任务会直接在主线程执行。

但如果_myQueue1是自己创建的队列,_myQueue2 = dispatch_get_main_queue(),也就是说在子线程中调用dispatch_sync往主线程派发任务,GCD不会做这种优化,任务会如你所愿在主线程中执行。

以上结论仅仅是简单代码测试得到,有可能在复杂环境下苹果有更为复杂的线程调度策略。大家在使用同步派发时需要自己注意下。

相关文章

  • GCD:dispatch_sync会在当前线程中执行派发到其他队

    dispatch_sync的官方文档中有这么一句话: As an optimization, this funct...

  • GCD

    GCD 异步刷新屏幕在主队列中执行 dispatch_sync()锁死 在当前线程中调用dispatch_sync...

  • iOS基础篇-GCD死锁

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

  • GCD&NSOperationQueue

    GCD队列规律 同步派发任务只能在当前线程执行 异步派发任务可以在其他线程执行 串行队列任务只能在一个线程中执行 ...

  • 多线程-锁

    dispatch_sync:立马在当前线程同步执行任务。dispatch_async:不要求立马在当前线程同步执行...

  • GCD死锁

    同步,异步:只是对是否开启新线程有影响 同步dispatch_sync(queue,^{}):在当前线程中执行任务...

  • iOS多线程 对GCD和死锁的理解

    GCD 两个函数 同步函数dispatch_sync(不具备开启新线程的能力):把block块放到指定队列中的队尾...

  • iOS笔记-多线程之GCD

    线程任务 同步: 在同一个线程中执行任务,任务没有完成前不返回,会阻塞当前线程; dispatch_sync ...

  • 三十七、多线程之(一)GCD

    iOS中常见的多线程方案 GCD执行方式:dispatch_sync()和dispatch_async()两种方式...

  • iOS多线程篇-GCD理解一

    执行原则 同步dispatch_sync阻塞线程,必须等待当前语句执行完毕,才会执行下一条语句 异步dispatc...

网友评论

      本文标题:GCD:dispatch_sync会在当前线程中执行派发到其他队

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