TaskCpp简介
TaskCpp是c++11开发的一个跨平台的并行task库,它的设计思路来源于微软的并行计算库ppl和intel的并行计算库tbb,关于ppl和tbb我在前面有介绍。既然已经有了这两个大公司开发的并行计算库,我为什么还要开发自己的并行计算库。有两个原因:
- ppl只能在windows上用不能跨平台,tbb能跨平台,但是受限于原始设计,tbb的task比较弱没有ppl的强大,所以他们不能完全满足我的要求;
- 我觉得可以用c++11可以开发出一个轻量级的好用的并行task库。
TaskCpp在接口设计上尽量和ppl保持一致,因为我觉得ppl的接口很好很强大。因此,TaskCpp的接口用法和语义和ppl基本是一致的。因为TaskCpp是一个轻量级的task库,总共也不过三百多行代码,本着简单够用的原则,只提供了一些和ppl类似的常用用法, 有些不常用的特性不考虑支持。比如,不支持任务的取消,因为加入任务的取消会导致增加很多复杂性,而实际中用得比较少,所以不考虑支持,够用就好。
支持的平台
需要支持c++11的编译器,建议编译器:
- linux: GCC4.7+
- windows: vs2012 nov ctp+, 最好是vs2013
库的使用
使用TaskCpp仅仅需要包含头文件即可,在程序中使用只需要包含#include <TaskCpp.h>和少量的boost头文件即可。
TaskCpp的功能
TaskCpp提供一下功能:
-
并行任务:一种并行执行若干工作任务的机制。
- 基本的异步任务
- 延续的任务
- 组合任务
- WhenAll
- WhenAny
- 任务组
-
并行算法:并行作用于数据集合的泛型算法。
- ParallelForeach算法
- ParallelInvoke算法
- ParallelReduce算法
TaskCpp用法介绍
并行任务
基本的异步任务Task
Task会创建一个异步操作,这个异步操作发起方式是延迟加载方式发起的,即在调用Task的Wait或者Get时才真正发起异步操作。Task可以通过std::function或者lambda表达式去创建,不支持直接原生函数创建,如果要用原生函数需要先通过lambda或者std::function包装一下。Task的Wait接口只是等待异步操作结束。Task的Get接口接收参数并等待异步操作结束并返回结果。PPL中的get接口是不能接收参数的,TaskCpp的Get接口是可以接受任意参数的,更灵活一点,算是较PPL的一个小优点吧。下面是Task的基本用法:
#include <TaskCpp.h> using namespace Cosmos; void TestTask() { Task<void()> task([]{cout << 1 << endl; }); task.Wait(); Task<void()> task1 = []{cout << 1 << endl; }; task1.Wait(); Task<int()> task2 = []{cout << 1 << endl; return 1; }; cout << task2.Get() << endl; Task<int(int)> task3 = [](int i){cout << i << endl; return i; }; cout << task3.Get(3) << endl; }