?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
TaskCpp?/strong>
TaskCpp是c++11开发的一个跨q_的ƈ行task库,它的设计思\来源于微软的q行计算库ppl和intel的ƈ行计库tbbQ关于ppl和tbb我在前面有介l。既然已l有了这两个大公司开发的q行计算库,我ؓ什么还要开发自qq行计算库。有两个原因Q?/p>
ppl只能在windows上用不能跨^収ͼtbb能跨q_Q但是受限于原始设计Qtbb的task比较弱没有ppl的强大,所以他们不能完全满x的要求;
我觉得可以用c++11可以开发出一个轻量的好用的q行task库?/p>
TaskCpp在接口设计上量和ppl保持一_因ؓ我觉得ppl的接口很好很强大。因此,TaskCpp的接口用法和语义和ppl基本是一致的。因为TaskCpp是一个轻量的task库,d也不q三癑֤行代码,本着单够用的原则Q只提供了一些和pplcM的常用用? 有些不常用的Ҏ不考虑支持。比如,不支持Q务的取消Q因为加入Q务的取消会导致增加很多复杂性,而实际中用得比较,所以不考虑支持Q够用就好?/p>
支持的^?/p>
需要支持c++11的编译器Q徏议编译器Q?/p>
linux: GCC4.7+
windows: vs2012 nov ctp+, 最好是vs2013
库的使用
使用TaskCpp仅仅需要包含头文g卛_Q在E序中用只需要包?include <TaskCpp.h>和少量的boost头文件即可?/p>
TaskCpp的功?/p>
TaskCpp提供一下功能:
q行dQ一Uƈ行执行若q工作Q务的机制?/p>
基本的异步Q?/p>
延箋的Q?/p>
l合d
WhenAll
WhenAny
dl?/p>
q行法Qƈ行作用于数据集合的泛型算法?/p>
ParallelForeach法
ParallelInvoke法
ParallelReduce法
TaskCpp用法介绍
q行d
基本的异步Q务Task
Task会创Z个异步操作,q个异步操作发v方式是gq加载方式发LQ即在调用Task的Wait或者Get时才真正发v异步操作。Task可以通过std::function或者lambda表达式去创徏Q不支持直接原生函数创徏Q如果要用原生函数需要先通过lambda或者std::function包装一下。Task的Wait接口只是{待异步操作l束。Task的Get接口接收参数q等待异步操作结束ƈq回l果。PPL中的get接口是不能接收参数的QTaskCpp的Get接口是可以接受Q意参数的Q更灉|一点,是较PPL的一个小优点吧。下面是Task的基本用法:
View Code
l合d--WhenAll
WhenAll保证一个Q务集合中所有的d完成。WhenAll函数会生成一个Q务,该Q务可在完成一lQ务之后完成?此函数可q回一个std::vector 对象Q该对象包含集合中每个Q务的l果?以下基本CZ使用WhenAll创徏表示完成其他三个d的Q务。下面是WhenAll的基本用法:
View Code
注意QWhenAll是非d的,它只是创Z个Q务,在Wait或Get时才发v异步操作。传递给WhenAll的Q务必Ll一的?换言之,它们必须都返回相同类型?/p>
l合d--WhenAny
WhenAny在Q务集合中L一个Q务结束之后就q回。函C生成一个Q务,该Q务可在完成一lQ务的W一个Q务之后完成?此函数可q回一?std::pair 对象Q该对象包含已完成Q务的l果和集合中d的烦引。下面是WhenAny的基本用法:
View Code
注意QWhenAny是非d的,它只是创Z个Q务,在Wait或Get时才发v异步操作。传递给WhenAny的Q务必Ll一的?换言之,它们必须都返回相同类型?/p>
dl?-TaskGroup
TaskGroup可以q行的处理一lQ务,TaskGroup可以接受多个task或者functionQTaskGroup的Wait{待所有Q务完成。下面是TaskGroup的基本用法:
View Code
PPL的task_group的Q务只能是void()形式的,TaskCpp允许一些简单类型的d如int()、double()、string(){,其实d的返回类型没有实际意义,因ؓWait没有q回|q里支持多种q回cd的Q务只不过是ؓ了减一炚wӞ用v来稍微方便一点Ş了。PPL加入d只能一个一个RunQ要加入多个d时有点繁琐,TaskCpp可以一ơRun多个dQ比PPL要方便一些。这两点是较PPL的两个小优点吧?/p>
q行法
ParallelForeach法
ParallelForeach法?STL std::for_each 法cMQ只?parallel_for_each 法q发执行d。用法比较简单:
View Code
ParallelInvoke法
ParallelInvoke法q行执行一lQ务?在完成所有Q务之前,此算法不会返回?当您需要同时执行多个独立的dӞ此算法很有用。ParallelInvoke和TaskGroup的作用是一L。用法比较简单:
void TestParaInvoke()
{
auto f = []{cout << "1" << endl; return 1; };
ParallelInvoke(f, []{cout << "2" << endl; });
}
ParallelReduce法
ParallelReduce法在实际应用中比较常用Q有点类gmap-reduceQ可以ƈ行的对一个集合进行reduce操作。ParallelReduce的用法稍微复杂一点,它的原型Q?/p>
ParallelReduce(range,init, reduceFunc);
ParallelReduce(range,init, rangeFunc, reduceFunc);
W一个参数是集合Q第二个参数是算法的初始|W三个参数rangeFunc是一个声UC间结果的函数Q第四个参数是中间结果的汇聚函数。如果调用ParallelReduce(range,init, reduceFunc)Q则表示rangeFunc和reduceFunc是一个函数?/p>