为什么线程会被非主队列用完?

Why would threads being used up for non-main queues?

http://devstreaming.apple.com/videos/wwdc/2015/718b7aw9tq/718/718_hd_building_responsive_and_efficient_apps_with_gcd.mp4

在 35:43。

因为线程池中的所有线程都被并发队列用完了。发生死锁是因为主队列将没有更多可用线程来执行 运行 任务。

我记得主队列有专门的主线程(或者线程池???)保证主队列顺利运行没问题

我理解错了哪一部分?

澄清一下,在主队列上调度的任务将始终在主线程上执行,但主线程并不专用于主队列。在另一个队列上分派的任务可以使用任何可用线程,包括主线程。

在幻灯片中显示的示例中,主线程正在执行循环,提交异步任务。 dispatch_async 内部是一个将工作添加到队列的同步块。一旦可用线程用完,这将阻塞直到有线程可用;所以主线程现在被阻塞了。

但是,每个线程都在将同步工作分派回主队列(这需要主线程),所以它们会阻塞等待主线程。由于没有抢占,主线程无法"re-tasked"去执行dispatch_sync,你就有了死锁条件

总结:

  • 两个队列互相阻塞(hold and wait)
  • 没有抢占权
  • 结果:死锁。