dispatch_barrier_async如何与目标队列交互?

Xtravar

给定创建了target2为的queue2(queue2 = dispatch_queue_create_with_target(name, attr, queue1))...

如果两个队列是并发的,那么dispatch_barrier_async在queue2上是否仅等待queue2为空,还是还要等待目标队列?当两个队列中都有各自的屏障块排队时,queue2的屏障块是否优先?

队列上的屏障不会影响其目标队列。

这是最容易凭经验证明的。例如:

- (void)experiment {
    dispatch_queue_t queue1 = dispatch_queue_create("1", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t queue2 = dispatch_queue_create_with_target("2", DISPATCH_QUEUE_CONCURRENT, queue1);

    dispatch_async(queue1, ^{
        [self taskOnQueue:1 taskNumber:1 color:1];
    });
    dispatch_async(queue2, ^{
        [self taskOnQueue:2 taskNumber:2 color:0];
    });
    dispatch_barrier_async(queue2, ^{
        [self taskOnQueue:2 taskNumber:3 color:0];
    });

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        dispatch_async(queue2, ^{
            [self taskOnQueue:2 taskNumber:4 color:0];
        });
        dispatch_async(queue1, ^{
            [self taskOnQueue:1 taskNumber:5 color:1];
        });
    });
}

立即分派任务1-3,并在0.5秒后分派任务4和5。任务3正在使用障碍。任务1和5开启queue1,任务2-4开启queue2所有任务各花费一秒钟。

结果如下。(我手动突出显示了这些任务编号,以使其更加清楚。)

在此处输入图片说明

您可以看到,队列(1)上的#5任务一开始就启动,即使(a)它是队列中的最后一个任务,并且(b)队列2在任务#3上有障碍。但是,第二个队列尊重任务3的障碍。

仅供参考,这些是生成那些兴趣点范围的实用方法

- (void)taskOnQueue:(uint32_t)code taskNumber:(uint32_t)arg1 color:(uint32_t)arg4 {
    [self pointOfInterest:code arg1:arg1 color:arg4 block:^{
        [NSThread sleepForTimeInterval:1];
    }];
}

- (void)pointOfInterest:(uint32_t)code arg1:(uint32_t)arg1 color:(uint32_t)arg4 block:(void (^)(void))block {
    kdebug_signpost_start(code, arg1, 0, 0, arg4);
    block();
    kdebug_signpost_end(code, arg1, 0, 0, arg4);
}

注意:相反是完全不同的问题。队列,如果他们的目标队列具有阻隔影响。如果目标队列被阻止(例如,如果将任务3更改为在目标队列上使用屏障运行queue1),那么第二个队列中的任务将等待其目标队列释放:

- (void)experiment2 {
    dispatch_queue_t queue1 = dispatch_queue_create("1", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t queue2 = dispatch_queue_create_with_target("2", DISPATCH_QUEUE_CONCURRENT, queue1);

    dispatch_async(queue1, ^{
        [self taskOnQueue:1 taskNumber:1 color:1];
    });
    dispatch_async(queue2, ^{
        [self taskOnQueue:2 taskNumber:2 color:0];
    });
    dispatch_barrier_async(queue1, ^{              // changed to queue 1
        [self taskOnQueue:1 taskNumber:3 color:1];
    });

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        dispatch_async(queue2, ^{
            [self taskOnQueue:2 taskNumber:4 color:0];
        });
        dispatch_async(queue1, ^{
            [self taskOnQueue:1 taskNumber:5 color:1];
        });
    });
}

这将导致:

在此处输入图片说明

在这里,任务3被分派了障碍(第一个Ⓢ路标在哪里),不仅直到在目标队列上完成任务1之后它才开始,而且第二个队列上的任务4(在第二个队列上运行)也没有开始(就像任务5一样,也要在其队列的目标队列上等待该屏障。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

GCD中的Dispatch_barrier_async和串行队列,它们之间有什么区别?

Swift 3中的dispatch_barrier_async等效项

如果没有ARC,我是否需要在dispatch_barrier_async中的Block_release dispatch_block_t

队列如何与foreach循环交互

如何记录消息队列上的交互?

iOS Core Data dispatch_async后台队列崩溃

如何使dispatch_async运行

如何使用dispatch_async

串行队列上的dispatch_async和dispatch_sync之间的区别?

在 dispatch_async 队列中的弱自我(dispatch_get_main_queue(),^{})

使用Objective-C中的大型中央dispatch / dispatch_async返回后台队列

Dispatch.main.async 如何“更新 UI”?

没有在模态运行循环中执行主队列上的dispatch_async块

performSelectorOnMainThread:和主队列上的dispatch_async()有什么区别?

主线程在viewDidLoad中的并发队列上或方法内执行dispatch_async很重要

为什么不能在dispatch_async串行队列中停止计时器?

如何使用ActiveMQ添加JNDI目标(主题和队列)?

如何在目标c中创建调度队列?

dispatch_barrier_sync总是死锁

目标-c:需要以下有关dispatch_async(GCD)的代码的解释

是GCD dispatch_barrier还是dispatch_sync?

如何在dispatch_async期间停止NSOperationQueue

在全局队列上用dispatch_async运行的块是否有可能在主线程上执行?

在Swift 3,Swift 4及更高版本中,我如何使用dispatch_sync,dispatch_async,dispatch_after等?

并发队列上的.barrier是否应该立即变为活动状态?

阿帕奇骆驼; 如何从匹配模式的队列目标路由所有消息

如何使Spring JMS从注解@JmsListener中选择目标队列名称

MPI_Barrier()如何工作?

队列和线程池之间的交互?