【问题标题】:iOS GCD: On which thread custom dispatch queue is executed? Few more questions on GCDiOS GCD:在哪个线程上执行自定义调度队列?关于 GCD 的更多问题
【发布时间】:2015-06-08 13:13:39
【问题描述】:

我有几个问题:

  1. 当创建任何自定义调度队列(串行或并发)时,它们会在哪个线程上执行任务。

  2. GCD 文档here 中的以下文字让我有点困惑:

除了您创建的任何自定义队列之外,系统还会自动创建一个串行队列并将其绑定到您的应用程序的主线程。有关获取主线程队列的更多信息,请参阅在运行时获取公共队列。

  1. 如果在全局队列中调用 dispatch_suspend() 或 dispatch_resume() 会发生什么?

【问题讨论】:

标签: ios


【解决方案1】:

您应该将这些问题分解为单独的问题。这种大问题让未来的搜索者很难。

当创建任何自定义调度队列(串行或并发)时,它们会在哪个线程上执行任务。

这没有定义。您不能对将使用哪个底层线程做出任何假设。在同一个队列中,从一个块到另一个块,它可能会发生变化。在某些情况下,它甚至可能是调度线程。

应用程序主线程上的队列是主调度队列。您可以通过dispatch_get_main_queue() 访问它。

全局队列忽略dispatch_suspend()dispatch_resume()。这在dispatch_get_global_queue() 的讨论中有记录。

【讨论】:

    【解决方案2】:
    1. 在创建任何自定义调度队列(串行或并发)时,它们会在哪个线程上执行任务。

    GCD 创建“工作线程”,将它们放在“池”中,并在需要线程时利用该池。归根结底,GCD 会为您处理所有与线程相关的事情,您无需担心。

    1. 我对 GCD 文档中的以下文本感到有些困惑:

    除了您创建的任何自定义队列之外,系统还会自动创建一个串行队列并将其绑定到您的应用程序的主线程。有关获取主线程队列的更多信息,请参阅在运行时获取公共队列。

    这只是说 GCD 为您创建了main 队列,并将其绑定到应用程序的主线程。由于我们在 GCD 中所做的一切都是使用队列,因此我们需要一个绑定到主线程的队列,以便我们可以使用标准 GCD 模式向它调度。

    1. 如果在全局队列上调用 dispatch_suspend()dispatch_resume() 会发生什么?

    作为documentation says,它们没有任何作用:

    suspend()resume()dispatch_set_context(_:_:) 函数的调用对返回的队列没有影响。

    您也不能在全局队列中使用障碍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 2022-08-23
      • 1970-01-01
      • 2021-10-24
      • 2013-07-13
      • 2011-08-05
      • 2013-01-05
      相关资源
      最近更新 更多