TaskCpp简介

  TaskCpp是c++11开发的一个跨平台的并行task库,它的设计思路来源于微软的并行计算库ppl和intel的并行计算库tbb,关于ppl和tbb我在前面有介绍。既然已经有了这两个大公司开发的并行计算库,我为什么还要开发自己的并行计算库。有两个原因:

  1. ppl只能在windows上用不能跨平台,tbb能跨平台,但是受限于原始设计,tbb的task比较弱没有ppl的强大,所以他们不能完全满足我的要求;
  2. 我觉得可以用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;
}
View Code

相关文章:

  • 2021-07-14
  • 2021-11-01
  • 2021-11-04
  • 2021-06-15
  • 2021-07-29
猜你喜欢
  • 2021-09-03
  • 2021-08-18
  • 2021-05-29
  • 2021-12-23
  • 2022-01-08
  • 2021-11-18
  • 2021-09-15
相关资源
相似解决方案