C++并发编程 异步任务
C++并发编程 异步任务
异步任务 std::async
(1) std::async 会返回一个 std::future 对象, 这个对象持有最终计算出来的结果. 当需要这个值时, 只需要调用对象的get()成员函数. 并且直到“期望”状态为就绪的情况下, 线程才会阻塞; 之后,返回计算结果.
std::future<int> answer = std::async([] {
std::stringstream stm;
stm << "future id:" << std::this_thread::get_id() << std::endl;
std::cout << stm.str();
int sum = ;
for (int i = ; i <= ; i++)
{
sum += i;
std::cout << i << " ";
}
std::cout << std::endl;
std::this_thread::sleep_for(std::chrono::seconds()); // 增加延迟(1s)
return sum;
});
std::stringstream stm;
stm << "main id:" << std::this_thread::get_id() << std::endl;
std::cout << stm.str();
std::cout << "answer is: " << answer.get() << std::endl; // 此时会被阻塞, 直到异步任务返回
std::cout << "tag 2" << std::endl;
(2) std::async 允许通过添加额外的调用参数, 向函数传递额外的参数.
如果第一个参数是一个指向成员函数的指针, 第二个参数提供有这个函数成员类的具体对象(可以通过指针, 或者包装在 std::ref 中), 剩余的参数可作为成员函数的参数传入.
否则, 随后的所有参数将作为函数的参数, 或作为指定可调用对象的第一个参数. 比如 std::thread, 当参数为右值(rvalues)时, 拷贝操作将使用移动的方式转移原始数据. 这就允许使用“只移动”类型作为函数对象和参数.
class XFun {
public:
XFun() {}
~XFun() {}
void f(const std::string& str) {
std::stringstream stm;
stm << "f called. " << this << "-->" << str << std::endl;
std::cout << stm.str();
}
std::string g(const std::string& str) {
std::stringstream stm;
stm << str << "[--> add by function g] " << this;
return stm.str();
}
//XFun& operator=(const XFun&) = delete;
//XFun(const XFun&) = delete;
void operator()(const std::string& str) {
std::stringstream stm;
stm << "operator() called. " << this << "-->" << str << std::endl;
std::cout << stm.str();
}
};
XFun x;
std::cout << "addr of x:" << &x << std::endl;
std::async(&XFun::f, &x, std::string("test f()"));
std::future<std::string> f2 = std::async(&XFun::g, x, std::string("test g() temp")); // 创建一个 x 对象的副本传入, 删除赋值函数后, 将不能编译
std::async(std::ref(x), std::string("test operator()"));
std::async(XFun(), std::string("test operator() temp")); // 创建一个 XFun 的临时对象传入
std::cout << f2.get() << std::endl;
(3) 默认情况下, std::async 会启动一个新线程来完成任务, 但是也可以指定额外的执行方式:
std::launch::defered 指定等到 wait 或 get 被调用时才执行.
std::launch::async 指定必须到独立的线程中执行.
默认为: std::launch::defered | std::launch::async
auto f3 = std::async(std::launch::deferred, [] {
std::stringstream stm;
stm << "f3 called. TID:" << std::this_thread::get_id() << std::endl;
std::cout << stm.str();
});
auto f4 = std::async(std::launch::async, [] {
std::stringstream stm;
stm << "f4 called. TID:" << std::this_thread::get_id() << std::endl;
std::cout << stm.str();
});
std::stringstream stm;
stm << "main. TID:" << std::this_thread::get_id() << std::endl;
std::cout << stm.str();
std::this_thread::sleep_for(std::chrono::seconds());
f3.wait();
C++并发编程 异步任务的更多相关文章
- C++笔记-并发编程 异步任务(async)
转自 https://www.cnblogs.com/diysoul/p/5937075.html 参考:https://zh.cppreference.com/w/cpp/thread/lock_g ...
- C# 并发编程 (异步编程与多线程)
并发:同时做多件事情 多线程:并发的一种形式,它采用多个线程来执行程序. 并行处理:把正在执行的大量的任务分割成小块,分配给多个同时运行的线程.并行处理是多线程的一种,而多线程是并发的一种. 异步编程 ...
- python 并发编程 异步IO模型
异步IO(Asynchronous I/O) Linux下的asynchronous IO其实用得不多,从内核2.6版本才开始引入.先看一下它的流程: 用户进程发起read操作之后,立刻就可以开始去做 ...
- [翻译]在 .NET Core 中的并发编程
原文地址:http://www.dotnetcurry.com/dotnet/1360/concurrent-programming-dotnet-core 今天我们购买的每台电脑都有一个多核心的 C ...
- .NET Core 中的并发编程
今天我们购买的每台电脑都有一个多核心的 CPU,允许它并行执行多个指令.操作系统通过将进程调度到不同的内核来发挥这个结构的优点. 然而,还可以通过异步 I/O 操作和并行处理来帮助我们提高单个应用程序 ...
- C++并发编程 互斥和同步
C++并发编程 异步任务(async) 线程基本的互斥和同步工具类, 主要包括: std::mutex 类 std::recursive_mutex 类 std::timed_mutex 类 std: ...
- python 并发编程 io模型 目录
python 并发编程 IO模型介绍 python 并发编程 socket 服务端 客户端 阻塞io行为 python 并发编程 阻塞IO模型 python 并发编程 非阻塞IO模型 python 并 ...
- Python并发编程之初识异步IO框架:asyncio 上篇(九)
大家好,并发编程 进入第九篇. 通过前两节的铺垫(关于协程的使用),今天我们终于可以来介绍我们整个系列的重点 -- asyncio. asyncio是Python 3.4版本引入的标准库,直接内置了对 ...
- Python并发编程之实战异步IO框架:asyncio 下篇(十一)
大家好,并发编程 进入第十一章. 前面两节,我们讲了协程中的单任务和多任务 这节我们将通过一个小实战,来对这些内容进行巩固. 在实战中,将会用到以下知识点: 多线程的基本使用 Queue消息队列的使用 ...
随机推荐
- ArcFace Demo [Android]
Free SDK demo 工程如何使用? 1.下载代码:git clone https://github.com/asdfqwrasdf/ArcFaceDemo.git 或者直接下载压缩包 2.前往 ...
- Linux下的计算器(bc、expr、dc、echo、awk)知多少?
linux 其他知识目录 原文链接:http://blog.chinaunix.net/uid-24673811-id-1760837.html linux下的三个命令可以用来作计算,下面一一讲解用法 ...
- KETTLE并行
1.转换的并行 转换的并行是改变复制的数量 上面的转换相当于下面的: 实际是把一个任务拆成三部分执行,相当于在一个数据库连接中做了三次查询,数据库连接的开销没有增加,但是有三个进程一起执行. 2.jo ...
- 0428数字口袋精灵app优化
"数字口袋精灵app"优化 目录: 一.项目github总仓库推送 二.开发成员 三.分工与合作 四.各模块成果 五.团队成员贡献分 内容: 一.项目github总仓库: http ...
- Python:字符串操作总结
所有标准的序列操作(索引.分片.乘法.判断成员资格.求长度.取最小值最大值)对字符串同样适用,且字符串是不可变的. 一.字符串格式化 转换说明符 [注]: 这些项的顺序至关重要 (1)%字符:标记转换 ...
- P4语法(4)Control block
Control block Control block之中用于放置设计好的Table和Action. 可以把control block认为是pipeline的一个模板,之前用的v1model中就是in ...
- prefix pch 中引用cocoapods 中的头文件失败
如题,遇到这个问题,卡了几个小时,记下来防止下次再卡住: 解决办法: 1.pod install, 2.新建pch文件:projectname-Prefix.pch, 3.按要求在工程配置中添加, O ...
- JDK源码分析 – HashMap
HashMap类的申明 HashMap的定义如下: public class HashMap<K,V> extends AbstractMap<K,V> implements ...
- 整理sql server数据类型
我们在平常开发过程中,在设计数据的时候,经常碰到数据类型选择的问题,为了更快,更合适地选择正确的数据类型,所以在这里做个总结. 分类 sql server 数据类型 c# 数据类型 描述 应用场景 字 ...
- 小程序 坐标算距离 (copy)
var EARTH_RADIUS = 6378137.0; //单位M var PI = Math.PI; function getRad(d){ retu ...