GCD中的线程和队列之间的关系是什么?
- 一个线程是否只包含一个队列?
- 如果我将一个块asynchronous调度到globalQueue,它可以在主线程上运行吗?
- 什么样的情况会导致
dispatch_sync
死锁?
1.一个线程是否只包含一个队列?
这种关系是一种方式。 串行队列可能持有一个线程来执行分派给它的块,但是线程不知道一个队列。 那么主线程是特殊的,它知道主队列。
我猜
调度队列并不表示它将运行哪个线程块或函数,我认为调度队列pipe理一个线程池,其中包含多个线程,当一个块被调度时,它将获取一个空闲线程。 所以一个线程可能在一段时间内为很多的调度队列工作。
但有一点可以肯定:当你将一个块分派给一个队列时,这个块所运行的线程就工作在一个确定的分派队列上,你可以使用dispatch_get_current_queue
来得到它。
2.如果我将一个块asynchronous调度到globalQueue,它可以在主线程上运行吗?
我认为它不会在主线程上运行任何block到globalQueue,因为它不能评估块的执行时间,如果是长时间的工作,它会阻塞主线程。
3.什么样的情况会导致dispatch_sync死锁?
我参考Concurrency programming guide
的段落
您不应该从正打算传递给该函数的同一队列中执行的任务调用dispatch_sync或dispatch_sync_f函数。 这对保证死锁的串行队列尤为重要,但对于并发队列也应该避免。