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



我有几个问题:

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

  2. 我对以下来自GCD文档的文本有点困惑:

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

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

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

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

未对此进行定义。您不能对将使用哪个底层线程做出任何假设。在同一队列中,它可能会在不同的块之间发生变化。在某些情况下,它甚至可能是调度线程。

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

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

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

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

  1. 以下来自GCD文档的文本让我有点困惑:

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

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

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

正如文件所说,它们没有任何影响:

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

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

最新更新