C++ 异步编程——task类(for VS11) 三

本文介绍 C++ 并行编程库 (PPL) 中的 Concurrency::task_group 和 Concurrency::structured_task_group 的使用方法,对比两者特性,并详细说明 structured_task_group 的操作流程与限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++ 异步编程——task类(for VS11) 三

在之前我们介绍的异步操作都是基于Task<>的,这个是被封装好的类,可以作为传入,或者传出参数。下面我们要介绍的任务组的概念,他是比Task<>更轻量级的异步调用方式。

在PPL中Concurrency::task_group和Concurrency::structured_task_group,这两个类都是异步操作的任务组,Concurrency::task_handle类是任务组的基本单位。

 

我们先用 Concurrency::structured_task_group举例,我们通过structured_task_group::run 去添加任务,这个任务就是 Concurrency::task_handle,他的构造函数参数可以是函数指针,结构体重载()操作符,或者是lambda表达式。我们通过structured_task_group::wait去执行已经添加的任务,或者通过structured_task_group::run_and_wait去添加并执行所有的任务

 

这里要注意一点的就是,这里的task都必须是没有返回值和传入参数的函数,或者lambda表达式。这就是和基于task<>最大的不同,基于task<>的任务组需要用when_all或者when_any来调度,我们可以获得到task<>的返回值,而structured_task_group不允许函数有传入和传出参数。

 

我们也可以创建一个数状的任务组,如下图 


 

 

对应的代码是


 

 我们可以通过structured_task_group::cancel 在内部或者外部来取消整个任务组,通过structured_task_group::is_canceling 来得到取消状态。

对于异常我们要在.wait()方法外面加try_catch




上面说完了  Concurrency::structured_task_group,Concurrency::task_group 的使用方法基本上和前者类似。但是后者比前者更灵活,同样消耗的资源也更多。

下面是他们两个之间不同的地方。 

1. task_group是线程安全的,可以在别的线程里面通过run添加task, structured_task_group不允许多线程操作,而且所有的操作必须写在一个线程代码块里。

2.  task_group可以再wait()方法执行之后,再通过run 方法添加task,而structured_task_group是固定的,.wait()后不能再添加。

3. structured_task_group 建立的任务组树,子节点必须在父节点里面调用wait()的方法,因为structured_task_group只能在一个线程代码块里面执行,所以子节点必须要调用wait(),而task_group不需要。

4.task_group 添加任务不需要调用make_task()方法, structured_task_group 必须调用。

    task_group tasks;

    tasks.run(&taskfuncton);
    tasks.run(myfunction);

    tasks.run_and_wait([] { cout<<"This is lambed express"<<endl; }); 

 

总之, task_group较之structured_task_group又多封装了很多东西,如果没有特殊需要structured_task_group可以写出更高效的代码。

 

 引用自:

http://msdn.microsoft.com/en-us/library/windows/apps/dd492427(v=vs.110).aspx 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值