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

Ran*_*all 9 iphone objective-c grand-central-dispatch ios

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

我有三个需要做的任务.

任务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同时运行?此外,有没有简单的方法来确保它们运行相同的次数?(来回交替)

Bra*_*son 2

你知道,我想我在 GRE 考试中遇到了这个问题,只有 A、B 和 C 是 Bob、Larry 和 Sue,他们都在同一个办公室工作。

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

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

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