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;
}

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