讲师中心 微信公众号

工具推荐

视频效率加速
AniShort
AniShort

AI短剧协同制作平台

Laper
Laper

剧本策划到成片协作

updream

一键生成高质量推广成片

剧云
剧云

中文短剧剧本制作平台

c++中如何获取系统CPU核心数_c++ std::thread硬件并发数【详解】

陌丽姑娘_9410

陌丽姑娘_9410

发布时间:2026-01-27 10:06:09

|

244人浏览过

|

来源于php中文网

原创

std::thread::hardware_concurrency() 不可靠,仅返回启发式估计值,可能为0或逻辑线程数而非物理核心数;应优先用sysconf(_SC_NPROCESSORS_ONLN)(Linux/macOS)或GetActiveProcessorCount(Windows)获取真实逻辑CPU数。

c++中如何获取系统cpu核心数_c++ std::thread硬件并发数【详解】

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(兼容旧版)。

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

Linux Omniscient
Linux Omniscient

>全知全能技能Linux版。

下载
#include <iostream>
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif

int get_logical_cpu_count() {
#ifdef _WIN32
    // Win10 1607+ 推荐,考虑 processor groups
    if (GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetActiveProcessorCount")) {
        return static_cast<int>(GetActiveProcessorCount(ALL_PROCESSOR_GROUPS));
    }
    // fallback
    SYSTEM_INFO si;
    GetSystemInfo(&si);
    return static_cast<int>(si.dwNumberOfProcessors);
#else
    long n = sysconf(_SC_NPROCESSORS_ONLN);
    return (n > 0) ? static_cast<int>(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、低延迟交易),这时你得自己解析拓扑,不能依赖标准库。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
讯飞绘文

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

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

小橡皮AI

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

WorkBuddy

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

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

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

豆包大模型

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

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

音述AI
音述AI Hot

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

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3248

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5449

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3909

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

506

2026.01.19

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

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

4818

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

603

2025.12.01

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3459

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3018

2023.07.27

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

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

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