微软已经在VS10中加入了Concurrency Runtime namespace来支持C++的异步编程,笔者认为异步编程在是现代编程语言的一个发展方向。在此总结一些异步编程的基本概念和语法,希望能给大家理解异步编程带来一些方便。
成都创新互联公司网站建设服务商,为中小企业提供成都做网站、网站制作服务,网站设计,网站托管、服务器租用等一站式综合服务型公司,专业打造企业形象网站,让您在众多竞争对手中脱颖而出成都创新互联公司。
首先,异步编程的基本单位是task class。我们把想要执行异步操作的函数放入task 里面,通过协调这些task的关系,来实现基于函数的异步操作。这种方式相对于传统的基于线程池的异步调用,开发者不需要关心底层的线程如何分配,资源如何同步,是否有死锁的存在。这样,开发者会更专注于代码的逻辑,进而提高编程的效率。
task
- #include
- #include
- using namespace Concurrency;
- using namespace std;
- int wmain()
- {
- task
t([]() { - return 42;
- });
- t.wait();
- wcout << t.get() << endl;
- }
我们可以用.then()的方法去指定一个连续的任务,就是在前一个task完成之后立刻执行.then()里面的函数。这个函数要求接受前一个任务返回的结果。比如前一个任务中函数返回的是int 那么在.then()的函数里面就要指定传入参数为int的lambda表达式()[int res]{ res++;}。.then()方法只要求传入参数和上一个任务相同,而返回值可以不同。比如下面的代码,第一个task返回int,在第一个then中返回void,然后返回int,最后返回void。这里要注意的是,在最后一个then()中调用wait,而不是t.wait(),否则第一个.then 不会执行。
- task
t([]() { - return 42;
- });
- t.then([](int res){wcout<<"Hello";}).then([](){return 1;}).then([](int res){wcout<
- wcout << t.get() << endl;
这段代码展示的是如何嵌套task,注意这里的返回值虽然是task
- task
t([]() { - wcout << L"Task A" << endl;
- // Create an inner task that runs before any continuation
- // of the outer task.
- return task
([]() { - wcout << L"Task B" << endl;
- return 1;
- });
- });
一组task的执行,我们可以把一组task放入到容器里,然后通过when_all(),这个函数去执行他们,when_all传入参数是容器迭代器的开始和结束。这里要求容器里面的task的返回值必须相同。这是没有返回值的例子
- // Start multiple tasks.
- array
, 3> tasks = { - task
([] { wcout << "Hello from taskA." << endl; }), - task
([] { wcout << "Hello from taskB." << endl; }), - task
([] { wcout << "Hello from taskC." << endl; }) - };
- auto joinTask = when_all(tasks.begin(), tasks.end());
- // Print a message from the joining thread.
- wcout << "Hello from the joining thread." << endl;
- // Wait for the tasks to finish.
- joinTask.wait();
这是有返回值的例子,注意when_all().then 的传入参数是vector
- // Start multiple tasks.
- array
, 3> tasks = { - task
([] { return 88; }), - task
([] { return 42; }), - task
([] { return 99; }) - };
- auto joinTask = when_all(tasks.begin(), tasks.end())
- .then([](vector
results) - {
- wcout << "The sum is "
- << accumulate(results.begin(), results.end(), 0)
- << L'.' << endl;
- });
- // Print a message from the joining thread.
- wcout << "Hello from the joining thread." << endl;
- // Wait for the tasks to finish.
- joinTask.wait();
when_all().wait()是当容器里面所有的task都被执行后,才继续向下执行。而when_any().wait()就是当容器里第一个task完成之后,就继续向下执行。和when_all 一样,when_any 要求task的返回值相同 。但是,when_any().then()的传入参数是pair
- // Start multiple tasks.
- array
, 3> tasks = { - task
([] { return 88; }), - task
([] { return 42; }), - task
([] { return 99; }) - };
- // Select the first to finish.
- when_any(tasks.begin(), tasks.end())
- .then([](pair
result) - {
- wcout << "First task to finish returns "
- << result.first
- << L" and has index "
- << result.second
- << L'.' << endl;
- }).wait();
这篇文章是这个系列的第一篇,旨在向大家介绍一些基本的概念和用法。我会在接下来的系列中,给大家展示一些更深层次的东西。
引用自:http://msdn.microsoft.com/en-us/library/windows/apps/dd492427(v=vs.110).aspx
网页标题:VisualStudio11下的C++异步编程1
地址分享:http://www.shufengxianlan.com/qtweb/news2/124652.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联