c++ cpu亲缘性

CPU亲缘性(CPU Affinity)是指将线程或进程固定到特定的CPU核心上运行的能力。这种做法可以减少上下文切换,提高缓存利用率,从而提升性能。

原理

  • 缓存局部性: 当线程在同一个CPU上运行时,它可以利用该CPU的缓存,减少内存访问延迟。频繁切换CPU会导致缓存失效,从而影响性能。
  • 减少上下文切换: 通过将线程绑定到特定CPU,可以减少操作系统在不同核心之间频繁调度的情况。
  • 热插拔支持: 在支持热插拔的系统中,CPU亲缘性可以确保线程不会在不必要的情况下迁移到新加入的CPU上。

实现

在不同的平台上设置CPU亲缘性的方法可能有所不同。在Linux中,使用pthread_setaffinity_np函数,而在Windows中,使用SetThreadAffinityMask函数。

linux下实现(c++)

以下是一个使用POSIX线程(pthread)库在Linux上设置CPU亲缘性的示例代码:

#include <iostream>
#include <thread>
#include <pthread.h>
#include <sched.h>
#include <unistd.h>void thread_function(int cpu_id) {// 设置线程亲缘性cpu_set_t cpuset;CPU_ZERO(&cpuset); // 清空CPU集CPU_SET(cpu_id, &cpuset); // 将目标CPU添加到CPU集// 获取当前线程IDpthread_t current_thread = pthread_self();// 设置亲缘性if (0 != pthread_setaffinity_np(current_thread, sizeof(cpu_set_t), &cpuset)) {std::cerr << "Error setting CPU affinity\n";return;}// 线程执行的任务std::cout << "Thread running on CPU " << cpu_id << std::endl;// 模拟工作for (int i = 0; i < 5; ++i) {std::cout << "Thread " << cpu_id << " working...\n";usleep(500000); // 休眠500毫秒}
}int main() {const int num_threads = 4;std::thread threads[num_threads];// 创建多个线程,每个线程绑定到不同的CPUfor (int i = 0; i < num_threads; ++i) {threads[i] = std::thread(thread_function, i);}// 等待所有线程完成for (auto& th : threads) {th.join();}return 0;
}

代码解析

  1. 头文件: 引入了所需的头文件,包括<pthread.h><sched.h>,用于线程和CPU调度。
  2. 线程函数:
    • 创建并清空一个cpu_set_t类型的变量。
    • 使用CPU_SET宏将目标CPU添加到CPU集。
    • 获取当前线程的ID,并调用pthread_setaffinity_np设置线程亲缘性。
    • 在控制台输出当前线程运行的CPU ID。
  3. 主函数: 创建多个线程,每个线程都绑定到不同的CPU上。

windows下实现(c++)

在Windows上,设置CPU亲缘性的方法如下:

#include <iostream>
#include <thread>
#include <windows.h>void thread_function(int cpu_id) {// 设置线程亲缘性HANDLE current_thread = GetCurrentThread();DWORD_PTR mask = 1 << cpu_id;if (0 == SetThreadAffinityMask(current_thread, mask)) {std::cerr << "Error setting CPU affinity\n";return;}std::cout << "Thread running on CPU " << cpu_id << std::endl;// 模拟工作for (int i = 0; i < 5; ++i) {std::cout << "Thread " << cpu_id << " working...\n";Sleep(500); // 休眠500毫秒}
}int main() {const int num_threads = 4;std::thread threads[num_threads];// 创建多个线程,每个线程绑定到不同的CPUfor (int i = 0; i < num_threads; ++i) {threads[i] = std::thread(thread_function, i);}// 等待所有线程完成for (auto& th : threads) {th.join();}return 0;
}

总结

CPU亲缘性是优化多线程程序性能的重要手段,能够提高缓存效率并减少上下文切换。根据操作系统的不同,使用不同的方法来实现亲缘性。在Linux上使用pthread_setaffinity_np,而在Windows上使用SetThreadAffinityMask。通过合理设置线程的CPU亲缘性,可以显著提升程序的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/55892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】栈和队列经典题目

目录 1.有效的括号【链接】 代码实现 2.用队列实现栈【链接】 代码实现 3.用栈实现队列 ​编辑 代码实现 4.循环队列&#xff08;数组实现&#xff09;【链接】 代码实现 1.有效的括号【链接】 题目描述&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&…

关于Flutter 中,App内购支付集成 Google 签名的管理-手动生成签名 APK

Google play 手动生成签名 APK 1. 要创建一个 JKS&#xff08;Java KeyStore&#xff09;文件&#xff0c;可以使用 keytool 命令行工具。keytool 是 JDK 自带的工具&#xff0c;用于生成和管理密钥库和证书。 步骤 1&#xff1a;安装 JDK 确保已安装 JDK。如果未安装&#…

Mycat 详细介绍及入门实战,解决数据库性能问题

一、基本原理 1、数据分片 &#xff08;1&#xff09;、水平分片 Mycat 将一个大表的数据按照一定的规则拆分成多个小表&#xff0c;分布在不同的数据库节点上。例如&#xff0c;可以根据某个字段的值进行哈希取模&#xff0c;将数据均匀的分布到不同的节点上。 这样做的好处…

数据结构7——二叉树的顺序结构以及堆的实现

在上篇文章数据结构6——树与二叉树中&#xff0c;我们了解了树和二叉树的概念&#xff0c;接着上篇文章&#xff0c;在本篇文章中我们学习二叉树顺序结构的实现。 目录 1. 二叉树的顺序存储结构 2. 堆的概念及结构 1. 堆的概念 2. 堆的结构 3. 堆的实现 1. 堆节点 2. 交…

R语言实现logistic回归曲线绘制

方式一&#xff1a;编制函数 x<-rnorm(10000)#设置随机种子 #编写绘图函数代码快 f <- function(x){y 1/(1 exp(-x))plot(x,y)}#sigmoid函数 f(x)​ 方式二&#xff1a;Sigmoid函数代码 x<-rnorm(10000)#设置随机种子 #编写绘图函数代码块 #y<-1/(1exp(-x)) y&…

数据结构-复杂度

复杂度 1.数据结构1.1算法 2.算法效率2.1复杂度的概念 3.时间复杂度3.1大O渐进表示法3.2时间复杂度计算示例3.2.1 示例13.2.2 示例23.2.3 示例33.2.4 示例43.2.5 示例5&#xff1a;3.2.6 示例63.2.7 示例7 4.空间复杂度4.1.1 示例14.1.2 示例2 5.常见复杂度对比6.复杂度算法题6…

【重学 MySQL】六十七、解锁检查约束,守护数据完整性

【重学 MySQL】六十七、解锁检查约束&#xff0c;守护数据完整性 检查约束的基本概念检查约束的语法检查约束的使用场景注意事项示例 在MySQL中&#xff0c;检查约束&#xff08;CHECK&#xff09;是一种用于确保表中数据满足特定条件的约束。 检查约束的基本概念 检查约束用…

考研前所学c语言02(2024/10/16)

1.一个十进制的数转化为二进制的就是不断除二取余&#xff0c;得到的余数从下到上取 比如123&#xff1a; 结果为&#xff1a; 同理其他的十进制转八进制&#xff0c;十六进制就除八&#xff0c;除十六即可 再比如123转十六进制&#xff1a; 因为余数是11&#xff0c;十六进…

【JavaEE初阶】深入理解网络编程—使用UDP协议API实现回显服务器

前言 &#x1f31f;&#x1f31f;本期讲解关于TCP/UDP协议的原理理解~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不…

oracle_查询建表语句

查询建表语句 SELECTdbms_metadata.get_ddl ( TABLE, <table_name> ) FROMdualdbms_metadata.get_ddl&#xff1a;是Oracle提供的一个函数&#xff0c;用于获取数据库对象的DDL语句&#xff0c;它允许你查看或导出数据库对象的创建脚本‘TABLE’&#xff1a; 是这个函数…

时间复杂度记法(大O记法)相关知识简记

一、概念 大 O 本是一个数学概念。 大 O 记法可用来描述一个函数的增长率的上限”&#xff0c;或者“如果函数 g(x)的增长速度不比函数 f(x)快&#xff0c;那么就称 g 属于 O( f )。 大 O 记法不只是用固定的数字来表示算法的步数&#xff0c;而是基于要处理的数据量来描述算…

Substrate 网络层深度解读:libp2p 助力去中心化点对点高效通信

区块链中需要高效的通信工具来确保节点之间的顺畅交互。而 libp2p 正是开发者在点对点通信中不可或缺的框架&#xff0c;提供了强大的模块化功能&#xff0c;使得去中心化网络中的消息传递变得更加灵活且安全。在 Substrate 中&#xff0c;libp2p 的集成帮助开发者轻松实现各种…

从0开始深度学习(12)——多层感知机的逐步实现

依然以Fashion-MNIST图像分类数据集为例&#xff0c;手动实现多层感知机和激活函数的编写&#xff0c;大部分代码均在从0开始深度学习&#xff08;9&#xff09;——softmax回归的逐步实现中实现过 1 读取数据 import torch from torchvision import transforms import torchv…

查找与排序-交换排序

交换排序是基于“比较”和“交换”两种操作来实现的排序方法 。 由于选择“比较”的基准元素不同&#xff0c;可将交换排序分为以下两种&#xff1a; 冒泡排序快速排序 一、冒泡排序 1.冒泡排序基本思想 因为其实现与气泡从水中往上冒的过程类似而得名。 每一趟的…

基于SpringBoot+Vue+uniapp微信小程序的垃圾分类系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

MYSQL 表对表快速迁移-直接拷贝表空间文件.ibd进行迁移

数据无价&#xff0c;操作前&#xff0c;建议先备份 前提条件 表结构一致&#xff1a; 源数据库和目标数据库中的表结构必须完全相同。这包括表的列定义、索引、约束等。 表使用 InnoDB 存储引擎&#xff1a; 这种迁移方法仅适用于使用 InnoDB 存储引擎的表&#xff0c;因为 .…

Redux (八) 路由React-router、嵌套路由、路由传参、路由懒加载

文章目录 一、React-Router的基本使用1. 安装及基本使用(路由映射配置)2. 路由跳转Link与NavLink3. Navigate导航4. 处理路径不存在的情况 二、嵌套路由三、手动跳转 (类似编程式路由导航)1. 函数式组件2. 类组件实现手动跳转 四、路由传参1. 路径设置占位符(params)2. search传…

Java面试指南:Java基础介绍

这是《Java面试指南》系列的第1篇&#xff0c;本篇主要是介绍Java的一些基础内容&#xff1a; 1、Java语言的起源 2、Java EE、Java SE、Java ME介绍 3、Java语言的特点 4、Java和C的区别和联系&#xff1f; 5、面向对象和面向过程的比较 6、Java面向对象的三大特性&#xff1a…

leetcode30:串联所有单词的字串

给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如&#xff0c;如果 words ["ab","cd","ef"]&#xff0c; 那么 "abcdef…

1. 解读DLT698.45-2017通信规约--预连接响应

国家电网有限公司企业标准&#xff0c;面向对象的用电信息数据交换协议DLT698.45-2017 为提高用电信息采集系统的业务适应性、采集效率、安全性和数据溯源性&#xff0c;规范用电信息数据交换协议的通信架构、数据链路层、应用层、接口类与对象标识&#xff0c;制定本标准。 …