c++中如何获取系统CPU核心数_c++ std::thread硬件并发数【详解】
技术百科
冰火之心
发布时间:2026-01-27
浏览: 次 std::thread::hardware_concurrency() 不可靠,仅返回启发式估计值,可能为0或逻辑线程数而非物理核心数;应优先用sysconf(_SC_NPROCESSORS_ONLN)(Linux/macOS)或GetActiveProcessorCount(Windows)获取真实逻辑CPU数。
std::thread::hardware_concurrency() 返回值到底靠不靠谱
std::thread::hardware_concurrency() 是 C++11 起提供的标准方式,用于查询系统“建议的”硬件线程数。但它返回的是 启发式估计值,不是精确核心数,更不是当前可用逻辑 CPU 数。
常见现象:在某些虚拟机、容器或启用了 CPU 限制的环境中,它可能返回 0;在超线程开启的 Intel CPU 上,它通常返回逻辑处理器总数(如 8 核 16 线程 → 返回 16),而非物理核心数。
- 它不区分物理核心和逻辑线程(Hyper-Threading / SMT)
- 它不感知 cgroups、CPU affinity 或 runtime 限制(比如
docker run --cpus=2) - 返回
0表示“无法确定”,此时不应当作 1 使用,而应 fallback 到其他探测方式
跨平台获取真实逻辑 CPU 数(推荐实操方案)
要拿到当前进程实际能调度到的逻辑 CPU 总数,优先用 OS 原生 API,再 fallback 到 std::thread::hardware_concurrency()。
Linux/macOS 下最可靠的是 sysconf(_SC_NPROCESSORS_ONLN)(POSIX),Windows 下用 GetActiveProcessorCount(ALL_PROCESSOR_GROUPS)(Win10 1607+)或 GetSystemInfo().dwNumberOfProcessors(兼容旧版)。
#include#ifdef _WIN32 #include #else #include #endif int get_logical_cpu_count() { #ifdef _WIN32 // Win10 1607+ 推荐,考虑 processor groups if (GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetActiveProcessorCount")) { return static_cast (GetA ctiveProcessorCount(ALL_PROCESSOR_GROUPS)); } // fallback SYSTEM_INFO si; GetSystemInfo(&si); return static_cast
(si.dwNumberOfProcessors); #else long n = sysconf(_SC_NPROCESSORS_ONLN); return (n > 0) ? static_cast (n) : 1; #endif } int main() { std::cout << "Logical CPU count: " << get_logical_cpu_count() << "\n"; std::cout << "std::thread::hardware_concurrency(): " << std::thread::hardware_concurrency() << "\n"; }
如何区分物理核心数和逻辑线程数
仅靠标准 C++ 无法做到。必须调用平台特定接口:
- Linux:读取
/sys/devices/system/cpu/cpu*/topology/core_id并去重统计(需 root 权限非必需,但部分容器中不可读) - Linux(无 root):解析
/proc/cpuinfo中cpu cores(每物理 CPU 的核心数) ×physical id数量,或用lscpu | grep 'Core(s) per socket'+'Socket(s)' - macOS:
sysctl -n hw.physicalcpu和hw.logicalcpu - Windows:WMI 查询
Win32_Processor的NumberOfCores和NumberOfLogicalProcessors
注意:std::thread::hardware_concurrency() 从不提供物理核心数 —— 它的设计目标就是“适合并行任务的线程上限”,即逻辑线程数。
实际写并发程序时该用哪个值
绝大多数场景下,你应该用 get_logical_cpu_count()(或 sysconf(_SC_NPROCESSORS_ONLN))作为线程池大小上限,而不是 std::thread::hardware_concurrency()。
- 当程序受 CPU 密集型负载主导时,线程数 ≈ 逻辑 CPU 数是最优起点
- 若混合 I/O,可适当上浮(如 ×1.5),但需压测验证
- 在容器中运行时,
/sys/fs/cgroup/cpuset/cpuset.effective_cpus才是真实可用 CPU 列表,需解析该文件(Linux only) -
std::thread::hardware_concurrency()唯一稳妥用途是:作为 fallback,且必须检查是否为 0
物理核心数只在极少数场景有用,比如绑定线程到独占物理核避免超线程干扰(real-time audio、低延迟交易),这时你得自己解析拓扑,不能依赖标准库。
# ai
# 的是
# 才是
# 它不
# 能为
# windows
# 但它
# 不应
# 而非
# 只在
# mac
# win10
# linux
# docker
# 并发
# macos
# c++
# 接口
# 线程
# Thread
# cad
# ios
# 处理器
# 查询系统
# 虚拟机
# 超线程
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- c++中如何使用std::variant_c++1
- 如何在 Windows 11 中使用 AlomWa
- php查询数据怎么导出csv_查询结果转csv文件
- Windows10如何更改任务栏高度_Win10解
- Win11怎么关闭触摸键盘图标_Windows11
- Windows7怎么找回经典开始菜单_Window
- VSC怎么快速定位PHP错误行_错误追踪设置法【方
- c++的位运算怎么用 与、或、异或、移位操作详解【
- c++中如何求一个数的平方根_c++ sqrt函数
- 为什么本地php环境运行php脚本卡顿_php执行
- Windows 10怎么隐藏特定更新补丁_Wind
- Win11怎么开启移动热点_Windows11共享
- 如何关闭Win10自动更新更新_Win10系统自动
- Win11右键反应慢怎么办 Win11优化右键菜单
- php后缀怎么变mp4能播放_让php伪装mp4正
- Win11怎么更改任务栏颜色_Windows11个
- Windows电脑如何截屏?(四种快捷方法)
- Windows服务无法启动错误1067是什么_进程
- Win11怎样彻底卸载自带应用_Win11彻底卸载
- Win11怎么开启自动HDR画质_Windows1
- 如何开启Windows的远程服务器管理工具(RSA
- 如何在Golang中实现并发消息队列消费者_Gol
- 如何用::实现工具类方法调用_php静态工具类设计
- C++中的Pimpl idiom是什么,有什么好处
- 如何使用正则表达式提取以编号开头、后接多个注解的逻
- 如何在 VS Code 中正确配置并使用 NumP
- php8.4如何配置ssl证书_php8.4htt
- Windows资源管理器总是卡顿或重启怎么办?(修
- Win11怎么设置任务栏对齐方式_Windows1
- Win11怎么关闭定位服务_保护Win11位置隐私
- Python异步编程高级项目教程_asyncio协
- Windows 11怎么更改锁屏超时时间_Wind
- PHP主流架构怎么监控运行状态_工具推荐【操作】
- 小程序里php怎么变mp4_小程序调用php生成m
- Windows10系统怎么查看硬盘健康_Win10
- Python文件和流处理指南_高效读写大体积数据文
- Win10任务栏天气和资讯怎么关闭 Win10禁用
- Drupal 中 HTML 链接被双重转义导致渲染
- 作用域操作符会影响性能吗_php静态调用性能分析【
- Win11时间不对怎么同步_Win11自动校准互联
- Win11怎么格式化U盘_Win11系统U盘格式化
- Windows10怎么卸载预装软件_Windows
- php中::能访问全局变量吗_全局作用域与类作用域
- 如何在Golang中引入测试模块_Golang测试
- Win11摄像头无法使用怎么办_Win11相机隐私
- 如何使用Golang实现容器健康检查_监控和自动重
- Win10系统映像怎么恢复 Win10使用系统映像
- Win11怎么查看显卡温度 Win11任务管理器查
- Win10如何更改用户账户控制_Windows10
- PhpStorm怎么调试PHP代码_PhpStor


QQ客服