C++的异步编程: std::future, std::async 和 std::promise
在 C++ 中,std::future 和 std::async 是 C++11 标准 并发库的一部分。它们允许您异步/Asynchronous运行任务并在稍后获取结果,非常适合编写非阻塞代码和并行化计算。以下是它们的工作原理和典型用法。
C++ std::async
std::async 是一个高级函数,允许您异步启动一个任务(一个可调用对象,如函数或 lambda)。您指定要运行的函数,std::async 返回一个表示该 函数结果的 std::future。您可以稍后获取该结果,无论是任务完成时还是您需要时。
#include <iostream> #include <future> #include <chrono> int compute() { std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟工作 return 42; // 计算结果 } int main() { // 异步启动任务 std::future<int> result = std::async(std::launch::async, compute); // 当 compute() 运行时执行其他任务... // 获取 compute() 的结果(如果任务未完成则会等待) int value = result.get(); std::cout << "结果: " << value << std::endl; return 0; }
在此示例中:
- std::async(std::launch::async, compute) 异步启动 compute(),返回一个 std::future 对象。
- result.get() 调用等待任务完成(如果尚未完成)然后获取结果。
C++ std::launch 策略
- std::launch::async: 强制任务在新线程上异步运行。
- std::launch::deferred: 推迟执行直到 future 上调用 get() 或 wait(),使其同步运行。
如果省略策略,C++ 可能根据实现定义的标准选择其中之一。
C++ std::future
std::future 是一个类模板,表示稍后获取的结果。它本质上是一个异步操作结果的占位符。
关键方法
- get(): 如果结果尚未完成则等待并获取结果。调用 get() 后,std::future 变为空。
- wait(): 等待任务完成,但不获取结果。
- valid(): 如果 std::future 具有共享状态(即有结果可用)返回 true。
- wait_for() 和 wait_until(): 等待特定时间或直到结果可用的截止时间。
带有 wait_for 的示例
if (result.wait_for(std::chrono::seconds(1)) == std::future_status::ready) { std::cout << "结果已就绪: " << result.get() << std::endl; } else { std::cout << "仍在等待结果..." << std::endl; }
此代码检查结果是否在 1 秒内就绪。如果没有就绪则继续执行,不 阻塞。
C++ std::promise
对于更高级的用法,std::promise 允许您手动设置 std::future 的结果。std::promise 对象提供一个 std::future,您可以显式设置结果。
#include <iostream> #include <future> #include <thread> void setPromise(std::promise<int> p) { p.set_value(10); // 设置 promise 的结果 } int main() { std::promise<int> p; std::future<int> f = p.get_future(); // 从 promise 获取 future std::thread t(setPromise, std::move(p)); // 将 promise 传递给线程 t.join(); std::cout << "promise 的结果: " << f.get() << std::endl; // 获取结果 return 0; }
在此例子中,结果 10 是由 std::promise 设置的,std::future 可以通过 f.get() 获取。
C++ Future/Async/Promise 总结
- std::async: 启动一个异步运行的任务,返回一个 std::future。
- std::future: 表示将来会设置的值,通常是异步任务的返回值。
- std::promise: 允许手动设置 std::future 的结果。
使用这些功能,您可以有效地管理 C++ 中的异步任务,更轻松地并行运行计算或将工作分配给其他线程而不阻塞主线程。
英文:Tutorial on C++ Future, Async and Promise
C/C++编程
- C++ 编程练习题: 如何合并两个二叉树?
- C++ 编程练习题 - 找出第三大的数
- C++ 编程练习题 - 最多连续的 1
- C++ 编程练习题 - 左子树叶节点之和 (深度优先+广度优先+递归)
- C++ 编程练习题 - 最多水容器 (递归)
- C++的异步编程: std::future, std::async 和 std::promise
- C编程练习题: 翻转整数位
- C++编程练习题: 找出字符串的所有大小小组合
- C/C++ 中的内存管理器(堆与栈)
- C++编程练习题: 对两单向链表求和
扫描二维码,分享本文到微信朋友圈
The post C++的异步编程: std::future, std::async 和 std::promise first appeared on 小赖子的英国生活和资讯.相关文章:
- 步步高学生电脑上 Basic 编程语言 peek 用法示例 步步高学生电脑 是8位FC机的经典之作.它上面的BASIC有三个版本 1.0, 2.0 和 2.1 2.1 版本有个在线帮助,实际上是 help.cmd 1.0 是用 Esc 键退回到 DOS 的,...
- 换了个奥迪Q5大灯花了我1000英镑 我那辆奥迪Q5 SUV今年年检没通过,原因是左前车灯坏了,需要更换。车厂告诉我,光是订购零件就要700多英镑,加上人工费,总费用得1000英镑。但没办法,如果不修,车辆年检(MOT)就过不了,车也不能上路。 MOT是英国的机动车强制性安全检测(Ministry of Transport Test)的简称。 近侧前位置灯不工作 drl/位置灯集成(4.2.1(a)(ii)) Nearside Front Position lamp not working drl/position...
- 你给SteemIt中文微信群拖后腿了么? 这年头不缺算法, 就缺数据. 这两天花了很多时间在整API上, 整完之后自己用了一下还觉得真是挺方便的. 今天就突然想看一看自己是否给大家拖后腿了, 于是调用每日中文区微信群排行榜单的API, 刷刷拿着 NodeJs 练手: 1 2 3 4 5 6...
- HPZ800服务器主板太老不支持超过2TB的大硬盘 我家里一直用的是HPZ800服务器, 很吵, 很老, 虽然这台服务器已经有十年之久(我在EBAY上买来用了五年多了), 但是即使放到今天, 这服务器速度依旧很快, 很稳定. 由于服务器用的是ECC较验内存, 所以基本上不重启关机. HPZ800主机有两个硬核CPU – 因特志强 X5650 – 每个CPU是12核....
- 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
- ChatGPT-4 使用 Math Wolfram 插件解决数学脑筋急转弯问题 这篇文章, 我们看一个简单的数学问题(脑筋急转弯), 并用 Python 解决它. 我们看一下LLM(大型语言模型): ChatGPT3.5和ChatGPT4. 通过 ChatGPT-Plus 订阅(目前每月 20 美元 + VAT增值税), 我们可以启用...
- Javascript 中 sleep 函数实现 Javascript 中并没有 built-in 的 sleep 函数支持, 在 async/await/Promise 的支持之前, 我们可以用 busy-waiting 的方式来模拟: 1 2 3...
- 给孩子零花钱培养孩子正确的金钱观价值观 两个娃已经不知不觉7岁8岁了. 媳妇和我商量一下决定给孩子每人每周5英镑的零花钱(Pocket Money). 这样他们慢慢的就有自己的小积蓄备将来不时之需: 比如朋友聚会生日啥的需要准备礼物. 同时, 我们决定不再给孩子买零食(薯片啥的). 孩子一天好几餐, 晚上睡觉前还得吃零食, 我们就多买了很多水果面包, 健康的食物多吃一些总不是啥坏事. 孩子可以用这些零钱买自己想要的东西, 我们也不再过问. 孩子有自己的决定权. 第一周的时候,...