【问题标题】:Why would threads being used up for non-main queues?为什么线程会被非主队列用完?
【发布时间】:2018-11-07 13:22:03
【问题描述】:

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

35:43。

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

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

我解释错了哪一部分?

【问题讨论】:

    标签: ios multithreading threadpool grand-central-dispatch dispatch-queue


    【解决方案1】:

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

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

    但是,每个线程都将同步工作分派回主队列(这需要主线程),因此它们会阻塞等待主线程。由于没有抢占,主线程无法“重新分配”执行dispatch_sync,并且您有死锁条件。

    总结:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多