GCD 的线程数量限制分析

1,466 阅读1分钟

作者:酷酷的哀殿

原文地址:ai-chan.top/code/gcd-th…

1 前言

有网友在交流群反馈自己遇到一个“奇怪”的面试题:“GCD 最多开多少线程?”

本文,会通过实际的 Demo 测试不同场景下的情况

2 测试环境

iOS 14.3

3 测试代码

3.1 全局队列 - CPU 繁忙

第一个测试 case,我们通过 dispatch_get_global_queue(0, 0) 获取一个默认的全局队列,并通过 while 模拟 CPU 繁忙

经过测试:线程数量是 2

3.2 全局队列 - CPU 空闲

第二份代码,我们通过 [NSThread sleepForTimeInterval:10]; 模拟 CPU 空闲 进行测试

经过测试,线程数量最高是 64 个

3.3 自建队列 - CPU 繁忙

现在,我们看看 自建队列 - CPU 繁忙 的表现,本例会模拟大部分 APP 的场景,不同业务方都创建单独的队列管理自己的任务

经过测试,GCD 创建的线程数量最高是 512 个

3.4 自建队列 - CPU 空闲

自建队列 - CPU 空闲 创建的线程数量最高是 512 个

4 结论

经过测试,GCD 的全局队列会自动将线程数量限制在一个比较合理的数量。与之相比,自建队列创建的线程数量会偏大。

考虑到线程数量过大会导致 CPU 调度成本上涨。

所以,建议小型 APP 尽量使用全局队列管理任务;大型 APP 可以根据自己的实际情况决定适合自己的方案。