dispatch_sync
死锁?答案 0 :(得分:3)
<强> 1。一个线程只包含一个队列吗?
这种关系是一种方式。串行队列可以保存一个线程来执行分派给它的块,但是线程不知道队列。好吧,主线程是特殊的,它知道主队列。
我的猜测
调度队列没有指示它将运行阻塞或功能的线程,我认为调度队列管理包含许多线程的线程池,它将在调度块时获取一个空闲线程。因此,一段时间内一个线程可能适用于许多调度队列。
但有一种想法是肯定的:当你将一个块分派给队列时,运行该块的线程适用于一个确定的调度队列,你可以使用dispatch_get_current_queue
来获取它。
<强> 2。如果我将一个块异步调度到globalQueue,它是否可以在主线程上运行?
我认为它不会在主线程上运行任何块到globalQueue,因为它无法评估块的执行时间,如果它是一个长时间的工作,它将阻塞主线程。
<强> 3。什么样的情况会导致dispatch_sync死锁?
我在Concurrency programming guide
您永远不应该调用dispatch_sync或dispatch_sync_f函数 来自正在计划的同一队列中执行的任务 传递给函数。这对于串行来说尤为重要 队列,保证死锁,但也应该避免 并发队列。