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