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
当前分类随机文章推荐
- C++11 - std::chrono - 使用std::chrono::duration_cast进行时间转换,hours/minutes/seconds/milliseconds/microseconds相互转换,以及自定义duration进行转换 阅读2546次,点赞0次
- C++ – Unicode编码下的全角字符转半角字符 阅读2744次,点赞0次
- C++ - Web服务器框架Crow开发环境配置教程 阅读263次,点赞0次
- C++11 - 解析并获取可变参数模板中的所有参数 阅读1628次,点赞0次
- C++ - 在某一天某个时间点定时执行任务,比如2022年9月19日晚上9点准点执行发送邮件函数 阅读825次,点赞0次
- C++ - 日志库easylogging++初始化时不生成默认日志文件mylog.txt 阅读90次,点赞0次
- C++ - 格式化json字符串,方便展示json字符串的层次结构 阅读3936次,点赞0次
- C++ - C++类的特殊成员函数,析构函数,拷贝构造函数,移动构造函数,赋值运算符,移动赋值运算符介绍和基础语法 阅读1105次,点赞0次
- C++ - 使用cuda api获取本机显卡数量和显卡信息 阅读471次,点赞0次
- C++ - Asio和Boost.Asio的区别 阅读330次,点赞0次
全站随机文章推荐
- Pytorch - Pytoch结合Tensorboard实现数据可视化 阅读444次,点赞0次
- Python - 使用ffmepg批量转换某个文件夹以及所有子文件夹下所有的视频,修改其帧率/码率/分辨率到另一文件夹,并保留原有文件夹结构 阅读3298次,点赞0次
- WordPress - 在编辑文章发布时弹出是否发布提醒框 阅读3487次,点赞0次
- VTK读取一个TXT文档中的三维点坐标显示三维点云 阅读6743次,点赞4次
- 资源分享 - Computational Geometry:An Introduction(Franco P.Preparata, and Michael Shamos)英文高清PDF下载 阅读3893次,点赞0次
- WordPress - robots.txt 阅读2898次,点赞0次
- 资源分享 - Non-Photorealistic Computer Graphics - Modeling, Rendering, and Animation 英文高清PDF下载 阅读2218次,点赞0次
- Pytorch - 使用torch.matmul()替换torch.einsum('nctw,cd->ndtw',(a,b))算子模式 阅读3286次,点赞1次
- 资源分享 - A Biography of the Pixel 英文高清PDF下载 阅读2609次,点赞0次
- C++ - GBK编码下的全角字符转半角字符 阅读2091次,点赞0次
评论
169