我有几个问题:
当创建任何自定义调度队列(串行或并发)时,它们在哪个线程上执行任务。
我对GCD文档here中的以下文字感到有些困惑:
除了您创建的任何自定义队列之外,系统还会自动创建一个串行队列并将其绑定到应用程序的主线程。有关获取主线程队列的更多信息,请参阅运行时获取常见队列。
答案 0 :(得分:1)
你应该将这些事情分解为单独的问题。这种大型问题使得未来的搜索者很难。
当创建任何自定义调度队列(串行或并发)时,它们在哪个线程上执行任务。
这未定义。您无法对将使用哪个底层线程做出任何假设。在同一队列上从一个块到另一个块可能会发生变化。在某些情况下甚至可能是调度线程。
应用程序主线程上的队列是主调度队列。您可以使用dispatch_get_main_queue()
访问它。
全局队列忽略dispatch_suspend()
和dispatch_resume()
。这在dispatch_get_global_queue()
的讨论中有记录。
答案 1 :(得分:0)
- 在任何线程上创建任何自定义调度队列(串行或并发队列)时,它们都会执行任务。
GCD创建“工作线程”,将它们放置在“池”中,并在需要线程时利用该池。最重要的是,GCD会为您处理所有与线程相关的事情,而您不必担心。
- 我对以下GCD文档中的以下文字感到有些困惑:
除了您创建的任何自定义队列之外,系统还会自动创建一个串行队列并将其绑定到您应用程序的主线程。有关获取主线程队列的更多信息,请参见在运行时获取公共队列。
这只是说GCD为您创建了main
队列,并将其绑定到应用程序的主线程。由于我们在GCD中所做的一切都是与队列一起进行的,因此我们需要将队列绑定到主线程,以便我们可以使用标准的GCD模式将其分配给它。
- 如果在全局队列上调用
dispatch_suspend()
或dispatch_resume()
会发生什么?
作为documentation says,它们无效:
调用
suspend()
,resume()
和dispatch_set_context(_:_:)
函数对返回的队列无效。
您也不能在全局队列上使用障碍。