c++中关于Thread Affinity(线程亲和性)示例源码

news2024/11/26 11:28:14

win10下,可以在任务管理器里面设置某个进程的线程亲和性,如下图:

然后选择相关的cpu,如下图:

这么做可以使得相关的线程在某些密集型计算任务中只会运行在某些指定的cpu上,以便提高性能。

以下是windwos上c++程序中应用Thread Affinity的示例:

#include <iostream>
#include <vector>
#include <thread>
#include <chrono>
#include <bitset>
#include <array>
#include <random>

#include <intrin.h>
#include <windows.h>

namespace threadAffinity
{
std::string getProcessorVendorSerialnumber()
{
    std::array<int, 4> cpuInfo;
    __cpuid(cpuInfo.data(), 1);
    std::ostringstream infoBuf;
    infoBuf
        << std::uppercase << std::hex << std::setfill('0')
        << std::setw(8) << cpuInfo.at(3)
        << std::setw(8) << cpuInfo.at(0);
    return infoBuf.str();
}
std::string getThisThreadIdWithString()
{
    std::stringstream ss;
    ss << std::this_thread::get_id();
    return ss.str();
}
void proc(void)
{
    std::random_device rd{};
    std::mt19937       gen(rd());
    std::uniform_int_distribution<unsigned int> distribute(500, 1000);
    using namespace std::chrono_literals;
    std::string          info = "thread id=" + getThisThreadIdWithString() + ", apply cpu ids: ";
    for (auto i = 0; i < 6; ++i)
    {
        //std::this_thread::sleep_for(1s);
        std::this_thread::sleep_for(std::chrono::milliseconds(distribute(gen)));
        //std::string info = "thread id=" + getThisThreadIdWithString() + ",cpuid=" + std::to_string(GetCurrentProcessorNumber()) + ", call.\n";
        //std::cout << info;
        info += std::to_string(GetCurrentProcessorNumber()) + ",";
    }
    info += "\n";
    std::cout << info;
}
void applyThreadAffinity(std::thread& thr, DWORD_PTR inputMask)
{
    std::cout << "SetThreadAffinityMask success  inputMask: " << std::bitset<32>(inputMask) << "\n";
    // thanks: https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setthreadaffinitymask
    // If the function succeeds, the return value is the thread's previous affinity mask.
    // If the function fails, the return value is zero. 
    DWORD_PTR returnMask = SetThreadAffinityMask(thr.native_handle(), inputMask);
    if (returnMask == 0)
    {
        DWORD dwErr = GetLastError();
        std::cerr << "SetThreadAffinityMask failed, GLE=" << dwErr << '\n';
    }
    else
    {
        std::cout << "SetThreadAffinityMask success returnMask: " << std::bitset<32>(returnMask) << "\n";
    }
}
void testMain()
{
    std::cout << "threadAffinity::testMain() begin ...\n";
    std::vector<std::thread> threads;

    unsigned int i = 0;

    threads.emplace_back(proc);
    applyThreadAffinity(threads.back(), 0x1);// 0b000001
    i++;
    threads.emplace_back(proc);
    applyThreadAffinity(threads.back(), 0x2);// 0b000010
    i++;
    threads.emplace_back(proc);
    applyThreadAffinity(threads.back(), 0x4);// 0b000100
    i++;
    threads.emplace_back(proc);
    applyThreadAffinity(threads.back(), 0x3);// 0b000011
    i++;

    for (; i < std::thread::hardware_concurrency(); ++i)
    {
        threads.emplace_back(proc);
        applyThreadAffinity(threads.back(), DWORD_PTR(1) << i);
    }

    for (auto& t : threads)
        t.join();
    //
    std::cout << "threadAffinity::testMain() end ...\n";
}
}

可能的输出如下所示:

SetThreadAffinityMask success returnMask: 00000000000011111111111111111111
SetThreadAffinityMask success  inputMask: 00000000000000100000000000000000
SetThreadAffinityMask success returnMask: 00000000000011111111111111111111
SetThreadAffinityMask success  inputMask: 00000000000001000000000000000000
SetThreadAffinityMask success returnMask: 00000000000011111111111111111111
SetThreadAffinityMask success  inputMask: 00000000000010000000000000000000
SetThreadAffinityMask success returnMask: 00000000000011111111111111111111
thread id=30096, apply cpu ids: 18,18,18,18,18,18,
thread id=15588, apply cpu ids: 8,8,8,8,8,8,
thread id=25948, apply cpu ids: 7,7,7,7,7,7,
thread id=35928, apply cpu ids: 6,6,6,6,6,6,
thread id=15184, apply cpu ids: 9,9,9,9,9,9,
thread id=6396, apply cpu ids: 0,0,0,0,0,0,
thread id=22032, apply cpu ids: 15,15,15,15,15,15,
thread id=18116, apply cpu ids: 17,17,17,17,17,17,
thread id=23424, apply cpu ids: 11,11,11,11,11,11,
thread id=9556, apply cpu ids: 1,1,1,1,1,1,
thread id=21996, apply cpu ids: 12,12,12,12,12,12,
thread id=30992, apply cpu ids: 14,14,14,14,14,14,
thread id=22372, apply cpu ids: 5,5,5,5,5,5,
thread id=13832, apply cpu ids: 2,2,2,2,2,2,
thread id=31816, apply cpu ids: 16,16,16,16,16,16,
thread id=13332, apply cpu ids: 19,19,19,19,19,19,
thread id=35936, apply cpu ids: 13,13,13,13,13,13,
thread id=27400, apply cpu ids: 0,1,1,0,1,1,
thread id=35172, apply cpu ids: 10,10,10,10,10,10,
thread id=36296, apply cpu ids: 4,4,4,4,4,4,

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

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

相关文章

接口自动化测试框架postman tests常用方法

postman常用方法集合&#xff1a; 1.设置环境变量 postman.setEnvironmentVariable("key", "value"); pm.environment.set("key", "value");//postman 5.0以上版本设置环境变量的方法 2.设置全局变量 postman.setGlobalVariable(&…

numpy 和 tensorflow 中的各种乘法(点乘和矩阵乘)

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了&#xff0c;直接在文末名片自取就可 点乘和矩阵乘…

JavaScript中的基础知识挑战

让我们进一步改进史蒂文的小费计算器&#xff0c;这次使用的是循环&#xff01; 创建一个包含所有10个测试账单值的数组 “账单”。为小费和总数创建空数组&#xff08;‘小费’和’总数’&#xff09;。使用我们之前写的’calcTip’函数&#xff08;不需要重复&#xff09;来…

企业内部安全与风控管理图解

企业内部安全说外部安全&#xff0c;企业领导者都非常关注&#xff0c;由于各方面原因&#xff0c;。。。力不从心&#xff0c;妥协&#xff01; 方向&#xff1a; 1、制度 结合企业实情&#xff0c;编制企业安全管理制度 2、硬件 处理常规硬件外观&#xff0c;加壳与锁定、…

Mybatis工作流程及原理详解

一、概述 1.何为mybatis&#xff1f; MyBatis 是一款优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c;将接口和 J…

计算存储是不是智算时代的杀手锏?

想象一下&#xff0c;在一个繁忙的数据中心里&#xff0c;有一家大型互联网公司叫做“数据中心的故事”。这家公司一直在使用传统的CPU架构来处理海量数据。但是随着数据量的不断增长&#xff0c;CPU架构遇到了很多问题和瓶颈&#xff0c;这让“数据中心的故事”感到非常苦恼。…

第一章:最新版零基础学习 PYTHON 教程(第四节 - Python 3 基础知识)

Python 3 是一种流行的高级编程语言&#xff0c;用于各种应用程序。以下是您应该了解的一些 Python 3 基础知识&#xff1a; 变量&#xff1a;在 Python 3 中&#xff0c;变量是通过将值分配给名称来创建的。例如&#xff0c;x 5 创建一个名为 x 的变量&#xff0c;并为其分配…

数据包络分析——SBM模型

写在前面&#xff1a; 博主本人大学期间参加数学建模竞赛十多余次&#xff0c;获奖等级均在二等奖以上。为了让更多学生在数学建模这条路上少走弯路&#xff0c;故将数学建模常用数学模型算法汇聚于此专栏&#xff0c;希望能够对要参加数学建模比赛的同学们有所帮助。 目录 1. …

康耐德视觉检测系统可以在元器件生产中发挥什么作用?

电子元器件作为电子信息产业链的上游产品&#xff0c;是开发通信、计算机及网络、数字音视频等系统和终端产品的基础&#xff0c;电子元部件工作是否可靠决定了电子设备运行是否正常。电子元器件的外观缺陷检测是一个非常关键的部分&#xff0c;因为这类产品一般都比较小。质量…

MyBatis 工具学习笔记(基础)

Whats this 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发是 Apache 的一个开源项目 Java EE 三层架构&#xff1a;表现层、业务层、持久层&#xff08;存储层&#xff09; &#xff08;持久层&#xff1a;负责将数据保存到数据库的那一层代码&#xff09; ORM&…

BUUCTF:[MRCTF2020]套娃

查看源码发现 PHP非法参数名传参问题&#xff0c;详细请参考我的这篇文章&#xff1a;谈一谈PHP中关于非法参数名传参问题 正则这里绕过使用%0a换行符绕过&#xff0c;payload: /?b.u.p.t23333%0a 得到下一步信息&#xff1a;secrettw.php 注释中的是JsFuck&#xff0c;用这…

Lostash同步Mysql数据到ElasticSearch(二)logstash脚本配置和常见坑点

1. logstash脚本编写&#xff08;采用单文件对应单表实例&#xff09; 新建脚本文件夹 cd /usr/local/logstash mkdir sql & cd sql vim 表名称.conf #如: znyw_data_gkb_logstash.conf 建立文件夹&#xff0c;保存资源文件更新Id mkdir -p /data/logstash/data/last_r…

VBA技术资料MF58:VBA_测试点是否在多边形中

【分享成果&#xff0c;随喜正能量】人一辈子&#xff0c;只能靠长期去做某件事情来成就自己&#xff0c;而不是靠某一个人来成就自己。关于这点&#xff0c;你要么及早领悟&#xff0c;要么等待时光给出教训&#xff0c;逼你领悟。 我给VBA的定义&#xff1a;VBA是个人小型自…

数据结构 第一章作业 绪论 西安石油大学

绪论第1章 1&#xff0e;简述下列概念&#xff1a;数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。 答案&#xff1a; 数据&#xff1a;是客观事物的符号表示&#xff0c;指所有能输入到计算机中并被计算机程序处理的符号的总称。如数学计…

【C++面向对象侯捷】大师写法,证明你学过!一出手就是正规军~

文章目录 1.Header&#xff08;头文件&#xff09;中防卫式声明&#xff01;2. 构造函数赋值3. const member functions(常量成员函数) > 不会改变数据内容的&#xff0c;加上const4. 参数 和 返回值尽量传 引用&#xff0c;减少 数据 传输5. 设计一个类&#xff0c;特别注意…

从功能测试到自动化测试你都知道他们的有缺点吗?

一、手工测试优点 测试人员的经验可以继承&#xff0c;对错误有猜测能力 测试人员有审美能力和心理体验 测试人员有逻辑推断能力 二、自动化的优点 自动化测试执行可以替代大量的手工机械重复性操作&#xff0c;测试工程师可以把更多的时间花在更全面的用例设计和新功能的测试上…

Python 爬虫使用 Selenium 如何在 WebElement 获得属性

首先&#xff0c;我们需要初始化驱动和指定使用特定的流量器。 代码如下&#xff1a; from selenium import webdriver wd webdriver.Firefox()上面的代码可以简单的理解为启动一个 Firefox 的实例。 使用 css 选择器 可以把程序读取的 HTML 理解为一个 Doc。 我们需要在 D…

三、双指针(two-point)

文章目录 一、算法核心思想二、算法模型&#xff08;一&#xff09;对撞指针1.[704.二分查找](https://leetcode.cn/problems/binary-search/)&#xff08;1&#xff09;思路&#xff08;2&#xff09;代码&#xff08;3&#xff09;复杂度分析 2.[15.三数之和](https://leetco…

Maven源码阅读(一)

获取源码 apache maven官网地址&#xff1a;https://maven.apache.org/ 不用点击&#xff0c;页面往下滚动&#xff0c;你会看到 找到源码地址&#xff0c;最终都是github&#xff1a;https://github.com/apache/maven 被墙了&#xff0c;可以用gitcode&#xff1a;https:…

Java基础13——异常的捕获与处理

什么是异常 异常是指程序在运行过程中出现的非正常情况&#xff0c;如用户输入错误&#xff0c;除数为零&#xff0c;文件不存在&#xff0c;数组下标越界等。 Java 异常体系结构 所有异常类都是Throwable 类的子类&#xff0c;他派生出两个子类&#xff0c;Error和Exception…