为什么线程会被非主队列用完?
Why would threads being used up for non-main queues?
在 35:43。
因为线程池中的所有线程都被并发队列用完了。发生死锁是因为主队列将没有更多可用线程来执行 运行 任务。
我记得主队列有专门的主线程(或者线程池???)保证主队列顺利运行没问题
我理解错了哪一部分?
澄清一下,在主队列上调度的任务将始终在主线程上执行,但主线程并不专用于主队列。在另一个队列上分派的任务可以使用任何可用线程,包括主线程。
在幻灯片中显示的示例中,主线程正在执行循环,提交异步任务。 dispatch_async
内部是一个将工作添加到队列的同步块。一旦可用线程用完,这将阻塞直到有线程可用;所以主线程现在被阻塞了。
但是,每个线程都在将同步工作分派回主队列(这需要主线程),所以它们会阻塞等待主线程。由于没有抢占,主线程无法"re-tasked"去执行dispatch_sync
,你就有了死锁条件
总结:
- 两个队列互相阻塞(hold and wait)
- 没有抢占权
- 结果:死锁。
在 35:43。
因为线程池中的所有线程都被并发队列用完了。发生死锁是因为主队列将没有更多可用线程来执行 运行 任务。
我记得主队列有专门的主线程(或者线程池???)保证主队列顺利运行没问题
我理解错了哪一部分?
澄清一下,在主队列上调度的任务将始终在主线程上执行,但主线程并不专用于主队列。在另一个队列上分派的任务可以使用任何可用线程,包括主线程。
在幻灯片中显示的示例中,主线程正在执行循环,提交异步任务。 dispatch_async
内部是一个将工作添加到队列的同步块。一旦可用线程用完,这将阻塞直到有线程可用;所以主线程现在被阻塞了。
但是,每个线程都在将同步工作分派回主队列(这需要主线程),所以它们会阻塞等待主线程。由于没有抢占,主线程无法"re-tasked"去执行dispatch_sync
,你就有了死锁条件
总结:
- 两个队列互相阻塞(hold and wait)
- 没有抢占权
- 结果:死锁。