社区
C++ 语言
帖子详情
C++异步编程
wsjmjxy
2012-07-16 09:14:04
谁有C++异步编程的实例,现在做开发要用到,急需用到,请高手指点
...全文
207
2
打赏
收藏
C++异步编程
谁有C++异步编程的实例,现在做开发要用到,急需用到,请高手指点
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
噬魂之主NO1
2012-07-16
打赏
举报
回复
C++异步编程 for VS2011(一)
微软已经在VS10中加入了Concurrency Runtime namespace来支持C++的异步编程,笔者认为异步编程在是现代编程语言的一个发展方向。在此总结一些异步编程的基本概念和语法,希望能给大家理解异步编程带来一些方便。
首先,异步编程的基本单位是task class。我们把想要执行异步操作的函数放入task 里面,通过协调这些task的关系,来实现基于函数的异步操作。这种方式相对于传统的基于线程池的异步调用,开发者不需要关心底层的线程如何分配,资源如何同步,是否有死锁的存在。这样,开发者会更专注于代码的逻辑,进而提高编程的效率。
task<T> 是一个模板类,T是函数返回值的类型,比如task<int> t([](){return 1;}),或者函数返回值为空task<void> t([](){return;})。task的构造函数传入参数可以是lambda表达式。我们声明了一个task之后,通过调用wait()方法去执行他,对于有返回值的task,我们调用.get()方法去取得他的返回值。下面是一个简单的例子
#include <ppltasks.h>
#include <iostream>
using namespace Concurrency;
using namespace std;
int wmain()
{
task<int> 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<int> t([]() {
return 42;
});
t.then([](int res){wcout<<"Hello";}).then([](){return 1;}).then([](int res){wcout<<res<<endl;}).wait();
wcout << t.get() << endl;
这段代码展示的是如何嵌套task,注意这里的返回值虽然是task<int>,但是外面的task的参数依然是int,这两个参数要保持一致。
task<int> t([]() {
wcout << L"Task A" << endl;
// Create an inner task that runs before any continuation
// of the outer task.
return task<int>([]() {
wcout << L"Task B" << endl;
return 1;
});
});
一组task的执行,我们可以把一组task放入到容器里,然后通过when_all(),这个函数去执行他们,when_all传入参数是容器迭代器的开始和结束。这里要求容器里面的task的返回值必须相同。这是没有返回值的例子
// Start multiple tasks.
array<task<void>, 3> tasks = {
task<void>([] { wcout << "Hello from taskA." << endl; }),
task<void>([] { wcout << "Hello from taskB." << endl; }),
task<void>([] { 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<T>
// Start multiple tasks.
array<task<int>, 3> tasks = {
task<int>([] { return 88; }),
task<int>([] { return 42; }),
task<int>([] { return 99; })
};
auto joinTask = when_all(tasks.begin(), tasks.end())
.then([](vector<int> 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<T, size_t> pair.first 是task的返回值,pair.second是已经完成的task的序号。
// Start multiple tasks.
array<task<int>, 3> tasks = {
task<int>([] { return 88; }),
task<int>([] { return 42; }),
task<int>([] { return 99; })
};
// Select the first to finish.
when_any(tasks.begin(), tasks.end())
.then([](pair<int, size_t> result)
{
wcout << "First task to finish returns "
<< result.first
<< L" and has index "
<< result.second
<< L'.' << endl;
}).wait();
骑着蜗牛去爬山
2012-07-16
打赏
举报
回复
lz发错地方了。这里是C#版
现代
C++
异步编程
示例
现代
C++
异步编程
示例,包括使用thread、async、packageed_task进行整数列表的求和操作,并与
C++
17 std::execution::par异步策略进行对比。
用
C++
concurrencytask实现
异步编程
(附代码实例).rar
用
C++
concurrencytask实现
异步编程
(附代码实例).rar
C++
网络编程例子说明异步非阻塞Socket的基本原理和工作机制
用一个最简单的例子说明异步非阻塞Socket的基本原理和工作机制
Visual
C++
在异步串行通信控制中的应用
系统介绍了Visual
C++
实现异步串行通信的基本原理,分别讲述了用Windows函数库API函数实现和C运行时库的实现方法,以及在控制系统中的编程应用实例。
asyncpp:
C++
异步操作
在
异步编程
中(例如,使用 Boost ASIO 的网络编程,其中线程不会阻塞网络调用),您将无法通过返回值将数据传递回调用函数。 如果有许多链式异步操作,或者串行和并行异步操作的某种组合,那么您很快就会遇到一堆回...
C++ 语言
64,642
社区成员
250,580
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章