前言
有网友在交流群反馈自己遇到一个“奇怪”的面试题:“GCD 最多开多少线程?”
本文,会通过实际的 Demo 测试不同场景下的情况
测试环境
iOS 14.3
测试代码
全局队列 - CPU 繁忙
第一个测试 case,我们通过 dispatch_get_global_queue(0, 0)
获取一个默认的全局队列,并通过 while
模拟 CPU 繁忙。
|
|
经过测试:线程数量是 2
全局队列 - CPU 空闲
第二份代码,我们通过 [NSThread sleepForTimeInterval:10];
模拟 CPU 空闲 进行测试
|
|
经过测试,线程数量最高是 64 个
自建队列 - CPU 繁忙
现在,我们看看 自建队列 - CPU 繁忙 的表现,本例会模拟大部分 APP 的场景,不同业务方都创建单独的队列管理自己的任务
|
|
经过测试,GCD
创建的线程数量最高是 512 个
自建队列 - CPU 空闲
|
|
自建队列 - CPU 空闲 创建的线程数量最高是 512 个
结论
经过测试,GCD
的全局队列会自动将线程数量限制在一个比较合理的数量。与之相比,自建队列创建的线程数量会偏大。
考虑到线程数量过大会导致 CPU
调度成本上涨。
所以,建议小型 APP 尽量使用全局队列管理任务;大型 APP 可以根据自己的实际情况决定适合自己的方案。