提交给调度组的块是串行执行还是同时执行?

Posted

技术标签:

【中文标题】提交给调度组的块是串行执行还是同时执行?【英文标题】:Are blocks submitted to a dispatch group executed serially or concurrently? 【发布时间】:2013-05-20 13:21:31 【问题描述】:

调度组是 GCD 的一项功能,它允许提交要调度到特定队列的块。关于队列,根据队列的类型分派块:如果队列是串行的,则块将相对于该队列串行执行;如果一个队列是并发的,同样会发生,但同时发生。

但是,关于组,调度是连续发生还是同时发生?我的意思是,如果一个组有一个调度队列和要调度的块的队列,那么下一个调度是否只有在前一个调度完成时才执行?

【问题讨论】:

【参考方案1】:

调度组中的成员身份与执行顺序无关。

调度组实际上只是一个计数器,dispatch_group_enter(group) 递增计数器,dispatch_group_leave(group) 递减计数器。

dispatch_group_async(group, queue, block) 是一个快捷方式:

dispatch_group_enter(group);
dispatch_async(queue, ^
    block();
    dispatch_group_leave(group);
);

即通过dispatch_group_async(group, queue, block) 提交的块的执行顺序仅取决于指定的queue(s)。

当调度组计数器达到零(组变为空)时,dispatch_group_wait(group) 中的所有等待者都被唤醒,并且通过dispatch_group_notify(group, queue, block) 提交给组的所有块都异步到各自的@ 987654329@s(即如果指定的queues 是并发/独立的,则这些块可以同时执行)。

【讨论】:

以上是关于提交给调度组的块是串行执行还是同时执行?的主要内容,如果未能解决你的问题,请参考以下文章

重定向提交到调度队列的块

verilog语句执行顺序的疑问?

AsyncTask 坑 多个task是串行执行还是并行的

python 并发

AsyncTask 坑 多个task是串行执行还是并行的

AsyncTask 坑 多个task是串行执行还是并行的