寒假技术总结八

#include <iostream> #include <vector> #include <algorithm> #include <future> template <typename RAIter> int parallel_sum(RAIter front, RAIter beg, RAIter end) { auto len = end - beg; if (len < 1000) { char out[50]; sprintf(out, "Calculate from %d to %d\n", beg - front, end - front); std::cout << out; return std::accumulate(beg, end, 0); } RAIter mid = beg + len / 2; auto handle_right = std::async(std::launch::async, parallel_sum<RAIter>, front, mid, end); auto handle_left = std::async(std::launch::async, parallel_sum<RAIter>, front, beg, mid); return handle_left.get() + handle_right.get(); } int main() { std::vector<int> v(20000, 1); std::cout << "The sum is " << parallel_sum(v.begin(), v.begin(), v.end()) << '\n'; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <vector>
#include <algorithm>
#include <future>
 
template < typename RAIter >
int parallel_sum ( RAIter front , RAIter beg , RAIter end )
{
     auto len = end - beg ;
     if ( len < 1000 )
     {
         char out [ 50 ] ;
         sprintf ( out , "Calculate from %d to %d\n" , beg - front , end - front ) ;
         std :: cout << out ;
         return std :: accumulate ( beg , end , 0 ) ;
     }
 
     RAIter mid = beg + len / 2 ;
     auto handle_right = std :: async ( std :: launch :: async ,
                             parallel_sum < RAIter > , front , mid , end ) ;
     auto handle_left = std :: async ( std :: launch :: async ,
                             parallel_sum < RAIter > , front , beg , mid ) ;
     return handle_left . get ( ) + handle_right . get ( ) ;
}
 
int main ( )
{
     std :: vector < int > v ( 20000 , 1 ) ;
     std :: cout << "The sum is " << parallel_sum ( v . begin ( ) , v . begin ( ) , v . end ( ) ) << '\n' ;
}

输出

可能一

可能二

可能….

…..

注意

如果在输出中间信息的时候不先现在字符串里输出会很乱,因为同一行cout输出不同项的操作不是原子的,中间可能会转到其他线程去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值