• 计算机图形学与计算几何经典必备书单整理,下载链接可参考:https://www.stubbornhuang.com/1256/

  • 问题反馈可发送邮件到stubbornhuang@qq.com

  • 在本站开通年度VIP,无限制下载本站资源和阅读本站文章

  • 欢迎大家交换友链,可在https://www.stubbornhuang.com/申请友情链接进行友链交换申请!

  • 本站会放置Google广告用于维持域名以及网站服务器费用。

  • 感谢大家访问本站,希望本站的内容可以帮助到大家!

  • 如果觉得本站的内容有帮助,可以考虑打赏博主哦!

  • 本站由于前段时间遭受到大量临时和国外邮箱注册,所以对可注册的邮箱类型进行了限制!

  • 工资「喂饱肚子」,副业「养活灵魂」!

C++ – Windows/Linux跨平台获取本机CPU核心数

C++ 发布于2023-03-01 阅读 3,288次 0次评论 0次点赞 本文共1761个字,阅读需要5分钟。

1 在Windows/Linux系统获取本机CPU核心数

1.1 使用Windows和Linux上的系统函数获取cpu的核心数

如果需要创建一个使用线程池的服务,那么线程池中的最大工作线程数目最好是少于本机CPU的核心数,这样既能最大化CPU的性能也能避免创建过多线程造成线程调度的开销,保持处理速度的最大化。

那么在Windows系统中提供了SYSTEM_INFO结构体保存当前计算机的信息,比如计算机的体系结构、cpu的类型、cpu的核心数等其他信息,其中SYSTEM_INFO结构体的dwNumberOfProcessors成员变量就保存了cpu的核心数量信息。

而在Linux系统中,我们可以通过系统函数sysconf()获取变量的值,而_SC_NPROCESSORS_CONF这个选项就存储了cpu的数量。除了这个之外,GNN C Library中也提供了get_nprocs_confget_nprocs用于获取系统cpu的核心数。其中get_nprocs_conf用于获取当前计算机cpu的所有核心数,而get_nprocs用于获取当前计算机可以使用的cpu核心数

那么接下来我们可以对这个功能进行跨平台封装。

1.2 对获取cpu核心数功能跨平台封装

获取cpu核心数功能跨平台封装代码如下

get_cpu_processor_num.h

/**
 * @author stubbornhuang
 * @email stubbornhuang@qq.com
 * @date 2023-03-01
 */


#ifndef _GET_CPU_PROCESSOR_NUM_H_
#define _GET_CPU_PROCESSOR_NUM_H_

#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
#include <Windows.h>

#elif defined(linux) || defined(__linux)
#include "unistd.h"
#include "sys/sysinfo.h"

#endif



namespace stubbornhuaung
{
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
    static int get_cpu_processor_num()
    {
        SYSTEM_INFO sysInfo;
        GetSystemInfo(&sysInfo);
        return sysInfo.dwNumberOfProcessors;
    }

#elif defined(linux) || defined(__linux)
    static int get_cpu_processor_num()
    {
        int cpu_num = sysconf(_SC_NPROCS_CONF);
        int cpu_enable_num = sysconf(_SC_NPROCS_ONLN);

        //int cpu_num = get_nprocs_conf();
        //int cpu_enable_num = get_nprocs();

        return cpu_num;
    }

#endif
}



#endif // !_GET_CPU_PROCESSOR_NUM_H_

使用代码如下

#include <iostream>

#include "get_cpu_processor_num.h"

int main()
{
    std::cout << stubbornhuaung::get_cpu_processor_num() << std::endl;

    return 0;
}

2 使用C++11的std标准库获取cpu的核心数

在C++11中的标准库中提供了跨平台的获取cpu核心数的功能,即

std::thread::hardware_concurrency()

这个函数返回可用硬件实现支持的并发线程数。

使用示例如下:

#include <iostream>
#include <thread>

int main()
{

    std::cout << std::thread::hardware_concurrency() << std::endl;

    return 0;
}

我的建议的是尽可能的使用标准库,这样无论怎么样,只要编译器是正确的,那么标准库就不会错。

欢迎扫码关注我的微信公众号,及时获取文章更新

微信公众号二维码

本文作者:StubbornHuang

版权声明:本文为站长原创文章,如果转载请注明原文链接!

原文标题:C++ – Windows/Linux跨平台获取本机CPU核心数

原文链接:https://www.stubbornhuang.com/2526/

发布于:2023年03月01日 11:07:24

修改于:2023年06月21日 17:08:08

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

文章末尾
上一篇
C++ - Windows/Linux跨平台gbk与utf8字符集编码转换
C++
下一篇
TensorRT - TensorRT was linked against cuBLAS/cuBLAS LT 11.6.1 but loaded cuBLAS/cuBLAS LT 11.5.4错误提示
TensorRT
当前分类随机文章推荐

发表评论

您必须 [ 登录 ] 才能发表留言!

关注我们的公众号

微信公众号