iOS GCD:执行哪个线程自定义调度队列?关于GCD的问题还很少

时间:2015-04-03 12:36:37

标签: ios

我有几个问题:

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

  2. 我对GCD文档here中的以下文字感到有些困惑:

  3.   

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

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

2 个答案:

答案 0 :(得分:1)

你应该将这些事情分解为单独的问题。这种大型问题使得未来的搜索者很难。

  

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

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

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

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

答案 1 :(得分:0)

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

GCD创建“工作线程”,将它们放置在“池”中,并在需要线程时利用该池。最重要的是,GCD会为您处理所有与线程相关的事情,而您不必担心。

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

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

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

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

作为documentation says,它们无效:

调用suspend()resume()dispatch_set_context(_:_:)函数对返回的队列无效。

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