C++多线程教程(三)利用多线程实现加速
简介
在前期基础知识储备以后,让我们正式进入利用多线程实现程序加速的环节
基本思想
将原始计算过程拆分为多个过程。例如计算五亿次加法过程。我们可以将其分为两个过程,从零加到两万五,再从两万五加到五万。
程序实现
下面的程序分别展示用两个线程和单个线程实现五亿次加法过程。measure测量时间函数已经在上一章节中详述,不再重复。
int main() {
long times = 500000000;
measure([times]() {
//双线程
long ans1 = 0, ans2 = 0;
thread t1 = thread(NumberAdd, 0, times / 2, ref(ans1));
thread t2 = thread(NumberAdd, times / 2, times, ref(ans2));
t1.join();
t2.join();
cout << "result of two treads: " << ans1 + ans2 << endl;
}
);
measure([times]() {
//单线程
long ans = 0;
NumberAdd(0, times, ans);
cout << "result of single treads: " << ans<< endl;
}
);
}
void NumberAdd(long start, long end, long &ans) {
int sum = 0;
for (long i = start; i < end; i++)
sum = sum + 1;
ans = sum;
}
程序结果如下
result of two treads: 500000000 PerformTest total time: 0.339524 result of single treads: 500000000 PerformTest total time: 0.651237
我们可以看到,利用双线程速度明显比单线程快了将近一倍。如果我们电脑不止2个核,我们可以拆分为更多线程执行,得到更短的时间。
进阶:使用feature类批量获取结果
以上代码是通过引用传递 ans 来获取结果,接下来我将介绍更加便捷的一种获取结果的方式——feature类。
基本语法
通过使用 async 函数,启动线程,返回一个 future 类,调用 __get __ 函数得到结果(阻塞式:执行完才能得到处理结果)。async 函数的使用方式与thread类似。
inline future<__async_result_of<_Fn, _Args...>> async(_Fn&& __fn, _Args&&... _args)
示例代码
#include<future> //要增加一个future头函数
int main() {
long times = 500000000;
measure([times]() {
//方括号捕捉外部变量times
int K = 5;
vector<future<long>> t_res;
t_res.reserve(K);
for (int i = 0; i < K; i++)
{
t_res.push_back(async(NumberAdd, times/K*i, times / K * (i+1) ) );
}
long ans = 0;
for (int i = 0; i < K; i++)
{
ans += t_res[i].get();
}
cout << ans << endl;
}
);
}
程序结果如下 分为五个线程的执行结果是单线程的四分之一,是不是加快了很多呢。
500000000 PerformTest total time: 0.160804
参考资料
链接: . 链接: .
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
WEB在线预览PDF,WORD方案总结
