讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何获取系统CPU核心数_C++使用hardware_concurrency函数方法【常用】

落伟大大_5154

落伟大大_5154

发布时间:2026-02-14 18:34:02

|

843人浏览过

|

来源于php中文网

原创

std::thread::hardware_concurrency() 返回0是标准允许的行为,需先判断是否为0,再fallback至系统API(如Linux用sysconf(_SC_NPROCESSORS_ONLN)或/proc/cpuinfo,Windows用GetSystemInfo)。

c++如何获取系统cpu核心数_c++使用hardware_concurrency函数方法【常用】

std::thread::hardware_concurrency() 返回值为 0 怎么办

这个函数不保证返回有效值,标准只要求它“尽力提供估计值”。在某些嵌入式环境、容器中(如 Docker 默认限制)、或编译器未正确识别硬件时,std::thread::hardware_concurrency() 可能返回 0 —— 这不是 bug,是标准允许的退让行为。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 永远不要直接用 std::thread::hardware_concurrency() 结果做硬性调度,先判断是否为 0
  • 若为 0,可 fallback 到备用方案(如读取 /proc/cpuinfo 或调用系统 API)
  • 注意:MSVC 在 Windows 上通常返回真实逻辑核心数;GCC/Clang 在 Linux 上依赖 sysconf(_SC_NPROCESSORS_ONLN),但若被 cgroup 限制,可能仍返回 0

Linux 下读取 /proc/cpuinfo 获取物理核心数 vs 逻辑核心数

/proc/cpuinfo 里没有直接叫 “physical cores” 的字段,需靠 cpu cores(每个物理 CPU 封装内的核心数)和 siblings(每个物理 CPU 封装内的逻辑线程数)推算。常见误区是把 processor 行总数当成“可用核心数”,其实那只是逻辑 CPU 编号总数(即超线程后的总线程数)。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 逻辑核心总数 = grep -c '^processor' /proc/cpuinfo
  • 物理核心总数 = grep 'cpu cores' /proc/cpuinfo | head -n1 | awk '{print $4}' × 物理 CPU 个数(grep 'physical id' /proc/cpuinfo | sort -u | wc -l)
  • 更可靠方式是用 sysconf(_SC_NPROCESSORS_ONLN),它返回当前 cgroup 允许使用的在线逻辑 CPU 数,与运行时实际可用性一致

Windows 上用 GetSystemInfo() 比 hardware_concurrency 更稳定

在 Windows 平台,GetSystemInfo() 是 Win32 API 中最轻量、最可靠的获取逻辑处理器数量的方式,且不受运行时环境(如服务账户权限、UWP 沙箱)影响。而 std::thread::hardware_concurrency() 在 MinGW 或某些旧版 MSVC 工具链中可能未实现或返回 0。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 包含头文件:#include <windows.h></windows.h>
  • 调用方式:SYSINFO si; GetSystemInfo(&si); int n = si.dwNumberOfProcessors;
  • 注意:dwNumberOfProcessors 是当前会话可见的逻辑处理器数(已考虑亲和性掩码),比 GetLogicalProcessorInformation() 更简单,也足够日常使用

跨平台封装时为什么不能只信 hardware_concurrency

因为它的语义是“建议的并发线程数”,而非“系统物理/逻辑核心数”。标准明确允许它返回 0 或任意保守值(比如为了省电主动降级)。真实项目中,你常需要区分:该数用于线程池大小?还是用于 SIMD 向量化宽度?或是绑定到特定核心?不同场景对“核心数”的定义完全不同。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 线程池初始化:优先用 std::thread::hardware_concurrency(),但必须检查 0 并 fallback
  • CPU 绑定或 NUMA 调度:必须用 OS 原生 API(如 pthread_setaffinity_np + sysconf,或 Windows 的 SetThreadIdealProcessor)
  • 构建时静态判断(如 CMake):可用 GetSystemInfo 或 sysconf 写小工具生成头文件,避免运行时开销

真正麻烦的从来不是“怎么拿到数字”,而是“这个数字到底代表什么”——同一台机器上,/proc/cpuinfo、sysconf、GetSystemInfo、hwloc、甚至 nproc 命令都可能给出不同结果,取决于你是否在容器里、有没有设 cgroup、是否启用了超线程、以及当前进程的亲和性掩码。

热门AI工具

更多
PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

3140

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

269

2026.02.03

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

1158

2023.09.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6879

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3305

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4308

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2925

2025.08.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4498

2023.08.10

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn