美文网首页
GCD异步并发队列内加入同步任务的执行顺序

GCD异步并发队列内加入同步任务的执行顺序

作者: louuXinnn | 来源:发表于2018-10-23 20:44 被阅读0次
    #import "ViewController.h"
    
    @interface ViewController ()
    @end
    
    @implementation ViewController
    - (void)viewDidLoad {
    
        //并发队列
        dispatch_queue_t q = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
        //异步任务
        dispatch_async(q, ^{
            //同步并发
            dispatch_sync(q, ^{
                NSLog(@"AAAA %@", [NSThread currentThread]);
            });
            //异步并发
            dispatch_async(q, ^{
                NSLog(@"BBBB %@", [NSThread currentThread]);
            });
            //异步并发
            dispatch_async(q, ^{
                NSLog(@"CCCC %@", [NSThread currentThread]);
            });
    
            for (int i = 0; i < 10; i++) {
                NSLog(@"%d   %@", i, [NSThread currentThread]);
            }
        });
    }
    
    /** 打印结果
     2018-10-23 20:27:26.256127+0800 testttt[6530:334192] AAAA <NSThread: 0x600000276840>{number = 3, name = (null)}
     2018-10-23 20:27:26.256531+0800 testttt[6530:334192] 0   <NSThread: 0x600000276840>{number = 3, name = (null)}
     2018-10-23 20:27:26.256547+0800 testttt[6530:334186] BBBB <NSThread: 0x604000270d00>{number = 4, name = (null)}
     2018-10-23 20:27:26.256583+0800 testttt[6530:334184] CCCC <NSThread: 0x604000270dc0>{number = 5, name = (null)}
     2018-10-23 20:27:26.256785+0800 testttt[6530:334192] 1   <NSThread: 0x600000276840>{number = 3, name = (null)}
     2018-10-23 20:27:26.257096+0800 testttt[6530:334192] 2   <NSThread: 0x600000276840>{number = 3, name = (null)}
     2018-10-23 20:27:26.257256+0800 testttt[6530:334192] 3   <NSThread: 0x600000276840>{number = 3, name = (null)}
     2018-10-23 20:27:26.257444+0800 testttt[6530:334192] 4   <NSThread: 0x600000276840>{number = 3, name = (null)}
     2018-10-23 20:27:26.258598+0800 testttt[6530:334192] 5   <NSThread: 0x600000276840>{number = 3, name = (null)}
     2018-10-23 20:27:26.259088+0800 testttt[6530:334192] 6   <NSThread: 0x600000276840>{number = 3, name = (null)}
     2018-10-23 20:27:26.260051+0800 testttt[6530:334192] 7   <NSThread: 0x600000276840>{number = 3, name = (null)}
     2018-10-23 20:27:26.260641+0800 testttt[6530:334192] 8   <NSThread: 0x600000276840>{number = 3, name = (null)}
     2018-10-23 20:27:26.261221+0800 testttt[6530:334192] 9   <NSThread: 0x600000276840>{number = 3, name = (null)}
     */
    @end
    

    原因猜想:

    -- 异步并发队列 中加入同步任务
    -- 同步任务会占用并阻塞当前线程(打印AAAA)
    -- 当同步任务执行完毕
    -- 当前被阻塞的任务继续(打印0), 且B C 异步执行

    纯粹个人猜想,如有问题请看官指导

    相关文章

      网友评论

          本文标题:GCD异步并发队列内加入同步任务的执行顺序

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