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循环并行计算 的相关文章

  • VLC 媒体播放器有 C# 界面吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以使用 C 控制台应用程序中的包装器从 VLC 播放中当前播放的文件中读取曲目统计信息 时间 标
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 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循环上面加一个指令