c++如何检测CPU核心数与信息_c++ std::thread::hardware_concurrency使用【技巧】
发布时间 - 2025-12-30 00:00:00 点击率:次std::thread::hardware_concurrency() 返回值为什么经常是 0?
std::thread::hardware_concurrency() 是 C++11 起提供的标准接口,用于获取系统建议的并发线程数。但它不保证返回有效值——很多实现(尤其是旧版 libstdc++、某些嵌入式或容器环境)在无法探测时直接返回 0。
- 返回
0并不表示“无 CPU”,而是“实现无法确定”,比如未启用_GLIBCXX_PARALLEL、/proc 不可用、或 Windows 上 GetSystemInfo 失败 - 它反映的是“推荐用于并行任务的线程上限”,不是物理核心数,也不区分超线程(例如 8 逻辑核可能对应 4 物理核 + HT)
- 该函数无副作用、不抛异常、线程安全,但不可靠——不能单独依赖它做线程池大小决策
Linux 下用 sysconf(_SC_NPROCESSORS_ONLN) 获取在线逻辑核数
比 std::thread::hardware_concurrency() 更稳定,且 POSIX 标准,glibc 和 musl 都支持。它读取当前在线(online)的逻辑处理器数量,等价于 getconf _NPROCESSORS_ONLN 命令结果。
int n = sysconf(_SC_NPROCESSORS_ONLN);
if (n < 1) {
n = 1; // fallback
}
-
_SC_NPROCESSORS_ONLN:只统计当前启用的逻辑核(/sys/devices/system/cpu/online),热插拔后会变化 - 若需物理核数,得解析
/sys/devices/system/cpu/cpu*/topology/core_id去重,或调用lscpu解析输出(非标准,不推荐嵌入) - 注意:该函数在 macOS / iOS 上不支持,需分支处理
Windows 上用 GetSystemInfo() 或 GetLogicalProcessorInformation()
Windows 没有 POSIX sysconf,但 GetSystemInfo() 简单可靠,返回的是逻辑处理器数量(含超线程)。
#ifdef _WIN32 #includeSYSTEM_INFO si; GetSystemInfo(&si); int n = static_cast (si.dwNumberOfProcessors); #endif
-
dwNumberOfProcessors是逻辑核数,和 Linux 的_SC_NPROCESSORS_ONLN行为一致 - 如需区分物理核/逻辑核,必须用
GetLogicalProcessorInformation()+ 解析RELATIONSHIP,代码量大且易出错,多数场景不需要 - MinGW 和 MSVC 都支持
GetSystemInfo,无需额外链接
跨平台封装建议:fallback 链与编译期检测
别写 “if Linux / else if Windows” 运行时分支。优先用编译宏选路径,再 fallback 到 std::thread::h,最后兜底为
ardware_concurrency()1 或 2。
- 避免运行时探测路径差异(比如误把 macOS 当 Linux 走
sysconf) - macOS 应走
sysctlbyname("hw.logicalcpu", ...),而非sysconf - 所有路径都应加 error check,尤其
sysctlbyname和sysconf可能设errno - 不要缓存结果到全局变量——CPU 热插拔、容器 cgroup 限核都可能导致数值变化,按需调用更稳妥
cpus)下,sysconf(_SC_NPROCESSORS_ONLN) 仍返回宿主机总核数,而非 cgroup 允许的核数。真要适配容器,得读 /sys/fs/cgroup/cpu.max(cgroup v2)或 /sys/fs/cgroup/cpu/cpu.cfs_quota_us(v1),那已是另一个层级的问题了。
# linux
# docker
# windows
# 处理器
# mac
# c++
# ios
# macos
# win
# cos
# 为什么
# if
# 封装
# Error
# 全局变量
# errno
# 接口
# 线程
# Thread
# 并发
# 的是
# 而非
# 不可用
# 旧版
# 超线程
# 热插拔
# 有效值
# 也不
# 尤其是
# 不需要
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
JS经典正则表达式笔试题汇总
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
公司网站制作需要多少钱,找人做公司网站需要多少钱?
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
详解Oracle修改字段类型方法总结
图册素材网站设计制作软件,图册的导出方式有几种?
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
实例解析Array和String方法
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
使用豆包 AI 辅助进行简单网页 HTML 结构设计
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
Laravel如何使用Gate和Policy进行授权?(权限控制)
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
如何正确选择百度移动适配建站域名?
详解MySQL数据库的安装与密码配置
微信小程序 五星评分(包括半颗星评分)实例代码
如何快速启动建站代理加盟业务?
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
微信小程序 input输入框控件详解及实例(多种示例)
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
太平洋网站制作公司,网络用语太平洋是什么意思?
如何基于云服务器快速搭建网站及云盘系统?
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
如何在阿里云域名上完成建站全流程?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
Linux网络带宽限制_tc配置实践解析【教程】
百度浏览器如何管理插件 百度浏览器插件管理方法
iOS UIView常见属性方法小结
如何批量查询域名的建站时间记录?
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
海南网站制作公司有哪些,海口网是哪家的?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
潮流网站制作头像软件下载,适合母子的网名有哪些?
JS碰撞运动实现方法详解
iOS验证手机号的正则表达式
如何利用DOS批处理实现定时关机操作详解
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
HTML 中如何正确使用模板变量为元素的 name 属性赋值
Android okhttputils现在进度显示实例代码

