并行依赖的是底层多线程处理机制,线程的创建和销毁,还有线程间的同步问题常常令人望而生畏。concrrency runtime提供的并行库Parallell Patterns Library (PPL)提高了线程处理机制的抽象级别,让C++多线程并行变得异常的简单。

先看一下构架:

应该很清楚了,PPL处于应用程序和线程处理机制之间。

再来看一个常规的例子,计算斐波那契数列:

#include <windows.h>
#include <ppl.h>
#include <array>using namespace std;
using namespace Concurrency;// Computes the nth Fibonacci number.
int fibonacci(int n)
{if(n < 2)return n;return fibonacci(n-1) + fibonacci(n-2);
}// Calls the provided work function and returns the number of milliseconds
// that it takes to call that function.
template <class Function>
__int64 time_call(Function&& f)
{__int64 begin = GetTickCount();f();return GetTickCount() - begin;
}int _tmain(int argc, _TCHAR* argv[])
{__int64 elapsed;// An array of Fibonacci numbers to compute.array<int, 4> a = { 24, 26, 41, 42 };// Use the for_each algorithm to compute the results serially.elapsed = time_call([&] {size_t sum = 0;for_each (a.begin(), a.end(), [&](int n){sum += fibonacci(n);});wcout << sum << endl;});   wcout << L"serial time: " << elapsed << L" ms" << endl;return 0;
}

如果调用并行算法,就把for_each换成parallel_for_each,不过要注意在一个并行循环体内,对共享资源的操作只允许读不允许写,所以要实现累加的话需要用到互斥对象  Concurrency::critical_section :

   elapsed = time_call([&] {critical_section cs;size_t sum = 0;parallel_for_each (a.begin(), a.end(), [&](int n){cs.lock();sum += fibonacci(n);cs.unlock();});wcout << sum << endl;});wcout << L"parallel time: " << elapsed << L" ms" << endl;

更好的办法是用Concurrency::combinable 来协调线程间的冲突:

   elapsed = time_call([&] {combinable<size_t> sum;parallel_for_each (a.begin(), a.end(), [&](int n){sum.local() += fibonacci(n);});size_t fibsum = sum.combine(std::plus<int>());wcout << fibsum << endl;});   wcout << L"parallel time: " << elapsed << L" ms" << endl;

取消并行循环要将并行算法包含在一个任务组中,并用Concurrency::task_group::cancel或Concurrency::structured_task_group::cancel取消这个任务组,因为从构架上来说,并行库是在task scheduler模块之下的,所以取消机制是自上而下的,也就是说取消的是整个任务组,看程序:

   structured_task_group tasks;tasks.run_and_wait([&]{parallel_for_each(a.begin(), a.end(), [&](int n)       {if (n == 41){         tasks.cancel();}});});

以上是parallel_for_each算法的大致应用,parallel_for算法用法大同小异,parallel_invoke用的较少。尽管concurrency runtime封装并优化了多线程调用,但是线程调用的开销仍是存在的,运用时要考虑下是否值得。一般来说,计算密集型的应用比较合适,比方说图象处理算法,而对于小型轻量循环体就弊大于利了。

--------------------------------------------------------------------

附一道面试题:一个人走楼梯,可以一次走1层,也可以走2层,也可以走3层,问n层楼梯有多少种走法。

解:

1----> 1
1阶楼梯的爬法总共为: 1
2----> 1 1
2----> 2
2阶楼梯的爬法总共为: 2
3----> 1 1 1
3----> 1 2
3----> 2 1
3----> 3
3阶楼梯的爬法总共为: 4
4----> 1 1 1 1
4----> 1 1 2
4----> 1 2 1
4----> 1 3
4----> 2 1 1
4----> 2 2
4----> 3 1
4阶楼梯的爬法总共为: 7

5----> 1 1 1 1 1
5----> 1 1 1 2
5----> 1 1 2 1
5----> 1 1 3
5----> 1 2 1 1
5----> 1 2 2
5----> 1 3 1
5----> 2 1 1 1
5----> 2 1 2
5----> 2 2 1
5----> 2 3
5----> 3 1 1
5----> 3 2
5阶楼梯的爬法总共为: 13

看下规律,大概就是个fibonacci数列,f(n) = f(n-1) + f(n-2) + f(n-3) ,其中f(1)=1,f(2)=2,f(3)=4

转载于:https://www.cnblogs.com/xfu123/archive/2012/04/21/2460820.html

concurrency runtime学习笔记之二:并行相关推荐

  1. Deep Learning(深度学习)学习笔记整理(二)

    本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流 [1]Deep learning简介 [2]Deep Learning训练过程 [3]Deep Learning模型之: ...

  2. Flowable学习笔记(二、BPMN 2.0-基础 )

    转载自  Flowable学习笔记(二.BPMN 2.0-基础 ) 1.BPMN简介 业务流程模型和标记法(BPMN, Business Process Model and Notation)是一套图 ...

  3. Core Data 学习笔记(二)被管理对象模型

    为什么80%的码农都做不了架构师?>>>    目录 Core Data 学习笔记(一)框架简介 Core Data 学习笔记(二)被管理对象模型 Core Data 学习笔记(三) ...

  4. PyTorch学习笔记(二):PyTorch简介与基础知识

    往期学习资料推荐: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 本系列目录: PyTorch学习笔记(一):PyTorch环境安 ...

  5. P4学习笔记(二)一个简单P4交换机实现

    P4学习笔记(一)初始P4 P4学习笔记(二)一个简单P4交换机实现 文章目录 1. 架构模型 2.预定义模块详细描述 2.1 Arbiter 模块 2.2 Parser runtime 模块 2.3 ...

  6. JUC学习笔记(二)

    JUC学习笔记(二) volatile关键字 JMM(Java Memory Model | Java内存模型) JMM同步规定 原理 工作流程 内存模型图 volatile特点 可见性 禁止指令重排 ...

  7. Slurm学习笔记(二)

    Slurm学习笔记(二) 上文:https://eternal-sun.blog.csdn.net/article/details/112208409 一.查看队列详细信息 scontrol show ...

  8. VHDL硬件描述语言学习笔记(二)

    本文主要参考b站视频:[考研]EDA技术(vhdl技术),建议有时间的跟着听一下,从第8节开始,一直到31节都是讲VHDL,讲的很全面,赶时间的可以直接看我这个笔记. 文章目录 1.3 VHDL语言要 ...

  9. 【《深度学习入门》—— 学习笔记(二)】

    <深度学习入门>-- 学习笔记(二)_5-8章 第五章 误差反向传播法 方法一:基于数学式 - 严密简洁 方法二:基于计算图(computational graph) - 直观 5.1 计 ...

最新文章

  1. Oracle Sales Cloud 实施(二)
  2. 【超链接】ToMyStudy
  3. python练习笔记——面试题 F(n) = F(n-1)+F(n-2)
  4. WAIC2020开幕在即,第四范式亮点抢先看
  5. 打开服务器数据库文件,如何打开服务器中的数据库文件
  6. IDEA或Webstorm设置Terminal终端字体大小
  7. WCF中配置文件解析
  8. SDL 从内存流中加载图像并显示
  9. shell基础之for循环语句
  10. 23种设计模式JAVA案例
  11. Android Room 数据访问对象(DAO)详解
  12. 合天网安就业班_【合天网安实验室】SQL注入入门一
  13. 【第十八题】填坑I(北理工/北京理工大学/程序设计方法与实践/小学期 )
  14. javaWeb实现裁剪图片上传整套方案
  15. 计算机操作系统之设备管理思维导图
  16. 今日头条赚钱是真的吗,今日头条赚钱规则是什么
  17. 程序员外包到底怎么了?
  18. soul网关系列(六):客户端注册soul流程分析
  19. 计算机网络ospf流程图,计算机网络7-OSPF祥解.ppt
  20. SAP:采购申请ME51N/ME52N/ME54N/ME57屏幕增强

热门文章

  1. 搭建golang+vscode开发环境
  2. 软件设计模式之单例模式
  3. Excel复制粘贴——跳过空单元格案例
  4. win10下安装mysql5.7.16(解压缩版)
  5. 单片机中去耦电容的使用
  6. tp auth 转载保存
  7. MEMCACHE分布式算法(PHP)
  8. nginx的反向代理、负载均衡、页面缓存、URL重写及读写分离
  9. FreeRTOS源码分析与应用开发02:任务管理
  10. oracle扩充undo,Oracle快速替换UNDO表空间方法