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

我有三个需要做的任务。

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

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

任务C:可以在任何队列上运行。不能与任务A或任务B异步运行。很少运行且运行很快。

现在我有这样的事情:

任务A通过串行队列X提交到主队列(将任务A提交到串行队列X以便将任务A提交到主队列)。

任务B提交给Serial QueueX。

与任务A一样,任务C由串行队列X提交到主队列。

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

那么,如何确保任务B和任务C永远不会同时运行,同时又允许A和B同时运行并阻止A和C同时运行?此外,是否有任何简单的方法来确保它们运行相同的次数? (来回交替)

最佳答案

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

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

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

就A和C上的负载平衡而言(我假设您要平衡),这可能是特定于应用程序的,并且可能需要您做一些实验以了解如何正确地交错操作而不浪费周期。我还要确保您确实需要它们交替交替运行,或者如果您可以让一个运行的时间比另一个运行的时间多一点的话。

10-07 19:43
查看更多