C++使用std::thread 多线程展开for循环,for循环并行计算

2023-11-13

  • 比如说有一个for循环,需要迭代100次,来累加1+2+3…+100计算其结果,创建10个线程,第一个线程累加1+2+…+10,第二个线程计算11+12+…+20等。那么如何优化呢?
  • 其实OpenMP库是可以直接调用的,只需要在for循环上面加一个指令 “#pragma omp parallel for num_threads(10)” 即可,非常简单。
  • Intel TBB 线程库也可以很简单的做到,具体不介绍
  • 下面介绍如何使用标准库std::thread手动分割任务 。如果任务数除以线程数有余数,那么把这些余数的部分放在最后一个线程上。
#include <iostream>
#include <thread>
#include <vector>
#include <atomic>
#include <tbb/task_arena.h>

using namespace std;

constexpr int THREAD_NUM = 10; 

atomic<int> a(0);

void test(int b) {
    int expected = a;
    // 使用了CAS
    while (!atomic_compare_exchange_weak(&a, &expected, a + b));
}

int main() {
    vector<thread> threads;
    threads.reserve(static_cast<size_t>(THREAD_NUM));

    // 假如有任务数为 100 个(编号为0,1,...,99), 平分到10个线程上去,每个线程执行10个任务
    int TASK_NUM = 100;
    int AVG_NUM = TASK_NUM / THREAD_NUM;
    
    for (int i = 0; i < THREAD_NUM - 1; ++i) {
        threads.emplace_back([i, AVG_NUM](){
            for (int j = i * AVG_NUM; j < (i + 1) * AVG_NUM; j++) {
                test(j + 1);
            }
        });
    }
    threads.emplace_back([&](){
        for (int j = (THREAD_NUM - 1) * AVG_NUM; j < TASK_NUM; j++) {
            test(j + 1);
        }
    });


    for (auto &t : threads) {
        t.join();
    }
    cout << "a = " << a << endl;
    // 计算结果为5050,计算正确
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++使用std::thread 多线程展开for循环,for循环并行计算 的相关文章

随机推荐

  • VS2022的简单设置

    一 创建一个C C 的VS新项目 1 单击右侧 创建新项目 2 语言选择 C 选择 所有平台 桌面 选择 windows桌面向导 最单击下一步 3 为项目取一个名字 放在合适的位置上 单击 创建 在弹出的窗口点击 空项目 最后单击完成 完成
  • DataX :文本文件 -> mysql 的使用及安装教程

    DataX安装环境准备 jdk1 6以上 python2 0 DataX安装 1 官网下载DataX https github com gkbattle13 DataX 点击Download下载地址 2 解压DataX tar zxvf d
  • typescript任意类型

    1 any类型 如果不声明类型 会自动设置为any类型 但是会失去TS类型检测的作用 let anys any str anys 123 anys anys true anys anys Symbol 123 2 unknown类型 let
  • Python 按照某列内容对两个DataFrame进行合并

    要将两个DataFrame进行合并 如data1 和 data2按照第一列的内容纵向合并为一个新的DataFrame 可以使用pandas库中的merge 方法 按照实际需求将how参数设置为 left right outer inner
  • react 三种通信方式

    react有三种通信方式 一 父传子 二 字传父 三 兄弟之间传值 一 父组件向子组件传值 父组件通过属性的方式传递参数 子组件通过props来接收父组件传递过来的参数 React中是单向数据流 数据只能从父组件通过属性的方式传给其子组件
  • VMware 安装CentOS7配置环境、安装虚拟机、选择cd/dvd的方式安装系统、系统安装引导界面、需要定制化的内容、配置磁盘分区、修改主机名、网络配置、修改windows的主机映射文件(host

    文章目录 想看远程终端工具Xshell Xftp传输工具 VMware 安装的点这里 1 CentOS 1 1安装虚拟机 1 2选择cd dvd的方式安装系统 1 3系统安装引导界面 1 4需要定制化的内容 1 4 1调整时间差 1 4 2
  • ES 配置文件 jvm配置

    elasticsearch yml 设置最大分片数 默认1000 cluster max shards per node 1000000 kibana 设置默认查询数量 深度分页问题 PUT movies settings index ma
  • JVM-垃圾回收机制

    JVM 垃圾回收机制 引言 1 什么是垃圾 2 为什么需要GC 3 Java中的垃圾回收 垃圾回收相关算法 垃圾判断算法 标记阶段 引用计数算法 标记阶段 可达性分析算法 垃圾清除算法 清除阶段 标记 清除算法 清除阶段 标记 整理算法 清
  • 视频会议直播和存储

    DVR的配置文件说明 dvr RTMP stream to file start to record to file when encoder publish reap flv according by specified dvr plan
  • 手把手搭建Python量化交易平台-3:jenkins安装详细过程,搭建机器自动运行平台

    概述 本文介绍利用jenkins搭建机器自动运行平台的步骤和效果 一 目的 搭建一个让机器自动 周期性或定制化的执行特定程序的平台 为后续的进一步的目标奠定基础 1 每天让机器自动下周当天的金融数据 2 每天让机器自动对数据进行分析 3 每
  • 双指针算法

    目录 一 双指针算法的概念 二 双指针算法的应用 1 拆分字符串中的单词 2 最长连续不重复子序列 题目 朴素算法 双指针算法 另类双指针算法 3 数组元素的目标和 题目 代码实现 4 判断子序列 题目 代码实现 一 双指针算法的概念 核心
  • 提升网速 网卡和驱动

    去某宝下单了 是网卡和驱动的问题 某宝说网卡和驱动是一个意思 以下是操作步骤 更新驱动程序后从联想官网下载本台电脑对应的驱动 下载可以识别自己主机编号的软件 主机信息识别工具 然后获取编号 然后下载自己的有线网卡
  • 使用VS2010编写Linux程序

    使用VS2010开发Linux程序的好处 编写和调试都很方便 甚至不用自己编写Makefile文件 系统直接就生成了 特别是对于一些不熟悉Linux环境以及gdb调试的同学来说 这个就相对来说容易上手多了 下面就来介绍下环境的搭建 环境 w
  • mac电脑前端环境配置【包含m1芯片】

    目录 一 nvm的安装 1 卸载已安装到全局的 node npm 2 nvm安装 安装命令 常用命令 可能的问题 二 Git环境 1 安装git 2 git ssh 配置 3 重新配置 重新配置 也要在Terminal终端进行 4 测试配置
  • windwos11降级,重装Windows10

    windwos11降级 重装Windows10 序言 硬件信息 前提说明 制作U盘启动盘 修改电脑bios配置 重装系统 U盘启动 注意事项 驱动问题 序言 电脑到手查看安装的是Windows11家庭版系统 在视觉上整体感受更加圆滑柔顺 但
  • C++中动态数组实现

    实现动态数组 动态数组 示例代码 运行环境 运行效果 动态数组 动态数组Vector可以动态扩展内存 其采用连续的内存空间 当内存空间不足 便以原来的容量的2倍或者1 5倍成倍的扩展 将原有的数组元素拷贝到新分配的内存空间中 释放原有的内存
  • [Unity3D]呼风唤雨:天气插件UniSky的使用教程与案例

    UniSky是Unity3D的一款模拟环境天气的插件 使用它可以简单的实现呼风唤雨的各种功能 下载地址 请点击我 使用起来也非常的方便 引入Package后 注意路径必须是英文否则会出错 Project中会多一个文件夹 下面我们来简单的创建
  • 华为OD机试 【玩牌高手】(Java )

    题目 代码 import java util Scanner public class CardScoreCalculator public static void main String
  • 关于线性回归那些事儿

    1 如何理解线性回归中的方差齐性 在两组和多组比较中 每组都有很多数据 可以求出每组的方差 然后比较就行了 很容易理解 但是在线性回归中 有的人就不理解方差齐性是什么意思了 因为线性回归中自变量x不是分类变量 x取值很多 通常情况下 每个x
  • C++使用std::thread 多线程展开for循环,for循环并行计算

    比如说有一个for循环 需要迭代100次 来累加1 2 3 100计算其结果 创建10个线程 第一个线程累加1 2 10 第二个线程计算11 12 20等 那么如何优化呢 其实OpenMP库是可以直接调用的 只需要在for循环上面加一个指令