GCD中线程和队列之间的关系是什么?

时间:2014-07-15 08:45:17

标签: ios

  1. 一个线程只包含一个队列吗?
  2. 如果我将一个块异步调度到globalQueue,它是否可以在主线程上运行?
  3. 什么样的情况会导致dispatch_sync死锁?

1 个答案:

答案 0 :(得分:3)

<强> 1。一个线程只包含一个队列吗?

这种关系是一种方式。串行队列可以保存一个线程来执行分派给它的块,但是线程不知道队列。好吧,主线程是特殊的,它知道主队列。

我的猜测

调度队列没有指示它将运行阻塞或功能的线程,我认为调度队列管理包含许多线程的线程池,它将在调度块时获取一个空闲线程。因此,一段时间内一个线程可能适用于许多调度队列。

但有一种想法是肯定的:当你将一个块分派给队列时,运行该块的线程适用于一个确定的调度队列,你可以使用dispatch_get_current_queue来获取它。

<强> 2。如果我将一个块异步调度到globalQueue,它是否可以在主线程上运行?

我认为它不会在主线程上运行任何块到globalQueue,因为它无法评估块的执行时间,如果它是一个长时间的工作,它将阻塞主线程。

<强> 3。什么样的情况会导致dispatch_sync死锁?

我在Concurrency programming guide

中引用该段落
  

您永远不应该调用dispatch_sync或dispatch_sync_f函数   来自正在计划的同一队列中执行的任务   传递给函数。这对于串行来说尤为重要   队列,保证死锁,但也应该避免   并发队列。