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

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不会做这种优化,任务会如你所愿在主线程中执行。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值