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

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

1.一个线程是否只包含一个队列?

这种关系是一种方式。 串行队列可能持有一个线程来执行分派给它的块,但是线程不知道一个队列。 那么主线程是特殊的,它知道主队列。

我猜

调度队列并不表示它将运行哪个线程块或函数,我认为调度队列pipe理一个线程池,其中包含多个线程,当一个块被调度时,它将获取一个空闲线程。 所以一个线程可能在一段时间内为很多的调度队列工作。

但有一点可以肯定:当你将一个块分派给一个队列时,这个块所运行的线程就工作在一个确定的分派队列上,你可以使用dispatch_get_current_queue来得到它。

2.如果我将一个块asynchronous调度到globalQueue,它可以在主线程上运行吗?

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

3.什么样的情况会导致dispatch_sync死锁?

我参考Concurrency programming guide的段落

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