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

相关文章

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat