
用 std::thread::hardware_concurrency() 是获取 CPU 逻辑核心数最标准、跨平台的方式,但它返回的值可能为 0,需谨慎处理。
它返回的是逻辑核心数,不是物理核心数
这个函数返回的是操作系统可调度的并发执行单元数量,也就是逻辑核心数(含超线程)。例如,一个 4 核 8 线程的 CPU,通常返回 8。它不区分物理/逻辑,也不提供物理核心数接口,如需物理核心数,需借助平台特定 API(如 Windows 的 GetLogicalProcessorInformation 或 Linux 的 /proc/cpuinfo)。
返回值可能为 0,必须检查
标准未强制要求实现必须返回准确值,某些编译器或环境(尤其是嵌入式、旧版本 libc++ 或禁用多线程支持时)可能返回 0,表示“无法确定”。不能直接当作线程数使用。
- 始终判断是否大于 0,否则回退到安全默认值(如 1 或 2)
- 示例写法:int n = std::thread::hardware_concurrency(); if (n
它不反映当前可用资源,也不随运行时变化
该值在程序启动时静态获取,不会因 CPU 亲和性设置、cgroup 限制(如 Docker 中限制了 2 个 CPU)、或系统负载而动态调整。例如容器中被限制为 2 核,hardware_concurrency() 仍可能返回宿主机总逻辑核心数。如需感知运行时约束,需结合平台机制(如 Linux 的 sched_getaffinity)。
立即学习“C++免费学习笔记(深入)”;
替代方案:仅当需要更高精度时考虑
若项目允许非标准依赖,可按平台补充探测:
- Linux:读取
/sys/devices/system/cpu/online或解析/proc/cpuinfo - Windows:调用
GetSystemInfo()(返回逻辑核心)或GetLogicalProcessorInformation()(可区分物理/逻辑) - macOS:用
sysctlbyname("hw.logicalcpu", ...)或"hw.physicalcpu"
但多数通用场景下,正确使用 std::thread::hardware_concurrency() 已足够可靠。










