C++多线程并行计算

2024-06-16 22:08
文章标签 c++ 多线程 并行计算

本文主要是介绍C++多线程并行计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C++多线程并行计算

  • 多线程(std::thread)

多线程(std::thread)

写了一个简短的并行计算例子
存粹的利用CPU性能计算素数个数

//实现标准库头文件<numeric>中accumulate函数的并行版本
#include <iostream>
#include <thread>
#include <numeric>
#include <algorithm>
#include <vector>
#include <functional>
#include <utility>
#include <windows.h>using std::thread;
using std::vector;
using std::accumulate;
using std::cout;
using std::endl;// 被执行的函数
template <typename Iterator, typename T> class Accum
{
public:void operator() (Iterator first, Iterator last, T &sum){sum = 0;for (; first != last; ++first){// 简单的计算素数auto k = std::sqrtf(*first);int i = 0;for (i = 2; i <= k; i++){if ((*first)%i == 0){break;}}if (i > k){++sum;}}}
};// 分发任务的函数
template <typename Iterator, typename T>
T ParallelAccum(Iterator first, Iterator last, T &sum)
{//计算迭代器中包含的元素数量const unsigned int len = std::distance(first, last);//若迭代器中没有元素则直接返回if (!len){return sum;}//获取机器支持的并发线程数const unsigned int num_thread = thread::hardware_concurrency();//最终实际上每个线程处理的元素个数const unsigned int block_size = len / num_thread;//保存每个线程累加的结果vector<T> results(num_thread);//启动比num_thread - 1个线程,因为main函数本身已开启一个线程vector<thread> threads(num_thread - 1);//开始并行计算Iterator block_begin = first;for (unsigned int i = 0; i < (num_thread - 1); ++i){Iterator block_end = block_begin;//将迭代器向前推进一个块,到达当前块的末尾位置std::advance(block_end, block_size);//传递参数,通常情况下thread的构造函数将复制所提供的参数,需要将模板参数转为引用threads[i] = thread(Accum<Iterator, T>(), block_begin, block_end, std::ref(results[i]));block_begin = block_end;}//处理最后一个线程,由于block_size = len / num_thread得到的结果不一定为整数,该线程处理剩余的所有元素Accum<Iterator, T>()(block_begin, last, results[num_thread - 1]);//对threads中所有线程调用join()std::for_each(threads.begin(), threads.end(), std::mem_fn(&thread::join));//return accumulate(results.begin(), results.end(), sum);
}// 计时结构
LARGE_INTEGER t1, t2, tc;void time_begin()
{QueryPerformanceFrequency(&tc);QueryPerformanceCounter(&t1);
}float time_end()
{QueryPerformanceCounter(&t2);return ((t2.QuadPart - t1.QuadPart)*1.0 / tc.QuadPart) * 1000;
}int main()
{// 装备任务队列vector<int> i_vec;int sum = 0;for (int i = 1; i != 501000; ++i){i_vec.push_back(i);}// 并行计算示例time_begin();sum = ParallelAccum(i_vec.cbegin(), i_vec.cend(), sum);cout << "time: " << time_end() << ", sum = " << sum << endl;// 一般计算示例time_begin();Accum<vector<int>::iterator, int> a;a(i_vec.begin(), i_vec.end(), sum);cout << "time: " << time_end() << ", sum = " << sum << endl;return 0;
}

在这里插入图片描述

这篇关于C++多线程并行计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067677

相关文章

C++读写word文档(.docx)DuckX库的使用详解

《C++读写word文档(.docx)DuckX库的使用详解》DuckX是C++库,用于创建/编辑.docx文件,支持读取文档、添加段落/片段、编辑表格,解决中文乱码需更改编码方案,进阶功能含文本替换... 目录一、基本用法1. 读取文档3. 添加段落4. 添加片段3. 编辑表格二、进阶用法1. 文本替换2

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.