如何同步不同调度队列中的任务



我是队列新手,我在设置以下方案时遇到了一些麻烦。

我有三个任务需要做。

任务A:只能在主队列上运行,可以与任务B异步运行,不能与任务c异步运行。运行量很大,但运行速度相当快。

任务B:可以在任何队列上运行,可以与任务A异步运行,不能与任务c异步运行,很少运行,但运行时间长。需要在任务C之后运行,但是任务C又不能与任务a异步运行。

任务C:可以在任何队列上运行。不能与任务A或任务b异步运行。很少运行,但运行速度快。

现在是这样的:

任务A由串行队列X提交给主队列(任务提交给串行队列X将任务A提交给主队列)。

任务B提交给串行队列x。

任务C和任务a一样由串行队列X提交到主队列。

这里的问题是任务C有时与任务b同时运行。主队列有时在运行任务b的同时运行任务C。

那么,我怎样才能保证任务B和任务C不会同时运行,同时又允许A和B同时运行,防止A和C同时运行呢?此外,是否有简单的方法来确保它们运行相同的次数?(前后交替)

你知道,我想我的GRE考试有这个问题,只有A, B, C是鲍勃,拉里和苏,他们都在同一个办公室工作。

我相信这个问题可以通过串行队列和调度信号量的组合来解决。如果您设置一个单一范围的串行调度队列,并将任务B和C提交给该队列,则可以保证它们不会同时运行。然后,您可以使用将计数设置为1的调度信号量,该信号量在任务a和任务C之间共享,以确保一次只运行其中一个。我在这里的回答中描述了这样一个信号量是如何工作的。您可能需要修改该代码以使用DISPATCH_TIME_FOREVER,以便任务A在提交之前被搁置,而不是在C正在运行时被丢弃(对于C的提交也是如此)。

这样,A和B将在不同的队列上运行(主队列和串行队列),因此它们可以并行执行,但B和C不能同时运行,因为它们的共享队列,A和C也不能,因为信号量。

就A和C上的负载平衡而言(我假设您想要平衡),这可能是相当特定于应用程序的,并且可能需要您进行一些实验,以了解如何在不浪费周期的情况下正确地交错操作。我还会确保你真的需要它们均匀地交替,或者如果你可以让一个比另一个运行得稍微多一些。

您是否检查出NSOperation来同步您的操作?

当然,有一种更简单的方法,假设C必须始终遵循a和B,即让a和B调度C作为它们自己的操作的完成回调(并且让C检查确保它没有已经运行,以防a和B都要求它同时发生)。完成回调模式(在dispatch_async手册页中描述)非常强大,是序列化需要耦合的异步操作的好方法。

如果问题是A, B, C, D和E,其中A-D可以异步运行,而E必须始终在最后运行,调度组是一个更好的解决方案,因为您可以设置E作为整个组的完成回调运行,然后简单地将A-E放在该组中。

最新更新