dispatch_group_wait是否允许切入线?

时间:2015-06-02 22:56:12

标签: ios macos grand-central-dispatch

这个问题是关于Grand Central Dispatch,特别是dispatch_group_wait()

假设dispatch_group名为group,其中有10个任务等待执行。

在其他地方,我有一项任务需要等待group中的任何任务在执行之前完成。为了实现这一点,我使用了dispatch_group_wait(group, DISPATCH_TIME_FOREVER)

要将其与group中的任务区分开来,我将其称为lonelyTask

如果group正在等待lonelyTask,首先执行lonelyTask或添加到group的任务?换句话说,当另一个任务等待执行时,将任务添加到group,在等待任务之前进行“切入”,还是维持它们被调用的顺序?

我搜索了文档,但未能找到这个问题的答案......

2 个答案:

答案 0 :(得分:3)

dispatch_group_waitdispatch_group_notify都会等待已进入群组的项目数转换为零。因此,如果您在所有原始十个任务完成之前向该组添加第十一个任务,则对dispatch_group_wait的调用将等待所有十一个任务完成,然后继续。

答案 1 :(得分:2)

组是一个+/-计数器(信号量),每次达到零时都会触发。它不知道任务,因为dispatch_group_async()只是在任务提交之前进入()s组的包装器,并将一个新块排入队列,该块将调用任务的块然后离开()该组。这就是全部。甚至可以在没有队列的情况下使用组作为异步保留计数器或sml。

所以一般来说,#34;你不能"。

但是,如果您能够[重新]将所有相关队列(dispatch_set_target_queue())定位到单个并发队列,那么该队列上的dispatch_barrier_async()可以执行您想要的操作(如果在适当的隔离中调用)。请注意,该组与此无关。

另外,原始的lonelyTask不是从组的角度来看的任务 - 它是不相关的执行线程,等到组平衡。 "在线切割的同义词"是一个障碍"。

另一种方法是为每个任务集创建一个私有组,并等待该特定组。这不会插入障碍 - 下面的任务不会等待lonelyTask的完成,任何不受控制的async()可能会违反规则"导致有趣的调试会话。