【Windows8开发】异步编程进阶篇之 task group的几种形式及其间的区别
【Windows8开发】异步编程进阶篇之 task group的几种方式及其间的区别前文中曾介绍过可以通过create_task创
【Windows8开发】异步编程进阶篇之 task group的几种方式及其间的区别
前文中曾介绍过可以通过create_task创建task并异步执行,这是对单个任务而言的,本文主要讨论任务组(task group)的管理,WinRT中提出了多种进行task group管理的方法,接下来开始一一说明。
1. Concurrency::when_all和Concurrency::when_anyWinRT提供了when_all和when_any来控制一组任务的执行。使用when_all的代码如下:
auto task1 = make_task([] { // do something here});auto task2 = make_task([] { // do something here});auto task3 = make_task([] { // do something here});task_group tasks;tasks.run(task1);tasks.run(task2);tasks.run(task3);tasks.wait();使用还算简单,通过make_task可以建立任务,但该任务不会被执行,make_task的返回值是task_handle对象,task_handle其实就是封装了task中的具体处理。然后定义task_group对象,通过其run方法启动一系列task_handle中的任务,也可以通过其wait方法等待所有任务执行完毕。那structured_task_group呢?代码类似,把上面代码中的task_group直接改为Strucutred_task_group,执行结果应该完全一样。既然如此,那structured_task_group和task_group又有何区别呢?这点是需要重点介绍的。
首先,task_group是线程安全的,也就是说你可以在不同线程中通过同一个task_group的对象向任务组中添加task或取消一个task,而structured_task_group则不是线程安全的,所以它必须在同一个线程中被创建和销毁,同时你只能在同一个线程中对其对象进行操作。其次,基于线程安全的问题,task_group允许在调用其wait后继续往其任务组中添加任务,而structured_task_group则不被允许。再次,task_group的run方法可以传递make_task创建的task_handle对象也可以直接传Lambda函数,而structured_task_group的run方法貌似只能传task_handle对象。最后,在实际使用中,可以根据实际需求或者个人使用习惯来选择具体实现方式。当任务组对象需要在不同线程中使用时,则使用task_group,如果只会在同一线程中使用,则使用structured_task_group更合适,因为它执行的开销更小,效率更高关于如何中止一个任务(task cancellation)的介绍会在后续其他文章中说明。