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

时间:2011-07-27 14:42:29

标签: iphone objective-c ios grand-central-dispatch

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

我有三个任务需要做。

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

任务B:可以在任何队列上运行,可以与任务A异步运行,不能与任务C异步运行。运行很少,但需要很长时间才能运行。需要任务C在之后运行,但任务C再次无法与任务A异步运行。

任务C:可以在任何队列上运行。无法与任务A或任务B异步运行。很少运行并快速运行。

现在我有这样的话:

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

任务B提交给Serial Queue X。

任务C由Serial Queue X提交到主队列,就像任务A一样。

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

那么,我怎样才能确保任务B和任务C永远不会同时运行,同时仍允许A和B同时运行并阻止A和C同时运行?此外,有没有简单的方法来确保它们运行相同的次数? (来回交替)

3 个答案:

答案 0 :(得分:2)

你知道,我认为我的GRE有这个问题,只有A,B和C是Bob,Larry和Sue,他们都在同一个办公室工作。

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

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

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

答案 1 :(得分:0)

您是否检查过NSOperation以同步您的操作?你可以在那里处理依赖。

答案 2 :(得分:0)

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

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