C++如何获取CPU核心数?(std::thread::hardware_concurrency)

c++kquote>std::thread::hardware_concurrency() 是获取逻辑核心数最标准跨平台方式,但可能返回 0,需检查后回退默认值;它不提供物理核心数,后者需平台特定 API。

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)。

替代方案:仅当需要更高精度时考虑

若项目允许非标准依赖,可按平台补充探测:

  • Linux:读取 /sys/devices/system/cpu/online 或解析 /proc/cpuinfo
  • Windows:调用 GetSystemInfo()(返回逻辑核心)或 GetLogicalProcessorInformation()(可区分物理/逻辑)
  • macOS:用 sysctlbyname("hw.logicalcpu", ...)"hw.physicalcpu"

但多数通用场景下,正确使用 std::thread::hardware_concurrency() 已足够可靠。