GCD中当前队列、调度队列和目标队列如何相互通信?

Mat*_*rix 2 multithreading grand-central-dispatch ios

我正在关注 GCD 的博客、在线文章、视频,并且遇到了一个术语目标队列(在某些博客上)。我以为我理解了 GCD,但是这个目标队列术语确实让我困惑。

我的理解是:

例如:

viewdidload(){
       DispatchQueue.main.async{
          print("hello world")
       }
}
Run Code Online (Sandbox Code Playgroud)
  • 当前队列:主队列,当 viewdidload 从主线程调用时。
  • 调度队列:主队列,因为“DispatchQueue.main”
  • 目标队列:我不确定,它可以是并发队列,但是当前队列,调度队列和目标队列在GCD中如何相互通信?

Rob*_*Rob 8

目标队列是一个比较高级的主题,但并不经常使用。除非您有非常具体的需求(见下文),否则您可以放心地忽略此功能。

\n

创建自定义队列时,您可以将其定义为具有一个目标,即自定义队列将在幕后使用的队列。因此,如果您创建一个A带有目标队列 的队列 ,T那么调度到的任何内容A实际上都会在T。因此,您可能会问人们什么时候可能倾向于使用这种模式:

\n
    \n
  1. 也许您有多个队列想要共享某些行为。例如,您可能有队列A、 、B,并且C所有队列都使用串行队列T作为其目标。A那么, 、B、 和不仅会C单独串行,而且也会跨AB、 和C串行。例如,将某件事分派到A队列B,将另一件事分派到队列,任务B将等待任务A完成(因为任务的串行性质)T,它们共享目标队列)。

    \n

    或者想象一下,您有三个并发队列 、ABC,但您偶尔想要在这三个队列之间设置屏障,某些关键任务无法与这三个队列上运行的任何内容同时运行。如果在创建AB、 和时C指定并发队列T作为所有这些队列的目标队列,如果向 、 和 中添加屏障任务,T则、 和ABC都将遵守该屏障。

    \n
  2. \n
  3. 如果您分析代码并且发现有大量的 \xe2\x80\x9ccontext 开关\xe2\x80\x9d 发生,而 GCD 代码导致不同线程之间不断跳转,则可以使用目标队列。对于常见的 GCD 应用程序(例如,在某些后台队列上运行此计算量大的代码,然后将更新分派回主队列),此目标队列概念没有提供任何实际好处。但是,如果您\xe2\x80\x99 在 GCD 队列之间进行数千/数百万次调度,那么它可能是相关的。但在您费心之前先分析一下您的代码,以检测发生了多少次上下文切换,并看看这是否会在您的场景中带来任何实际好处。

    \n

    有关您可以在何处使用目标队列来解决这些性能相关问题的示例,请参阅 WWDC 2017 视频现代化 Grand Central Dispatch 使用:统一队列标识简介。在上面的链接中,我\xe2\x80\x99已尝试让您进入视频的相关部分,但观看整个视频可能会提供更多背景信息。

    \n
  4. \n
\n

最重要的是,在某些情况下您可能需要指定目标队列,但在实践中它\xe2\x80\x99 非常罕见。

\n