提交给调度组的块是串行执行还是同时执行?
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(即如果指定的queue
s 是并发/独立的,则这些块可以同时执行)。
【讨论】:
以上是关于提交给调度组的块是串行执行还是同时执行?的主要内容,如果未能解决你的问题,请参考以下文章