C++异步编程,如何不等待未来
C++ async programming, how to not wait for future?
我正在尝试用C++学习异步编程。在 Python 中,我们有 await
,我们可以从该点恢复函数,但在C++ future
中等待结果并停止下一行代码。如果我们不想得到结果,而是继续下一行代码怎么办?我该怎么做?
您可以使用
std::future::wait_for
来检查任务是否已完成执行,例如:
if (future.wait_for(100ms) == std::future_status::ready) {
// Result is ready.
} else {
// Do something else.
}
并发 TS 包括非阻塞std::future::is_ready
(可能包含在 C++20 中(。如果它包含在标准中,则用法如下:
auto f = std::async(std::launch::async, my_func);
while (!f.is_ready()) {
/* Do other stuff. */
}
auto result = f.get();
/* Do stuff with result. */
或者,并发 TS 还包括 std::future::then
,我将其解释为例如:
auto f = std::async(std::launch::async, my_func)
.then([] (auto fut) {
auto result = fut.get();
/* Do stuff when result is ready. */
});
/* Do other stuff before result is ready. */
另请参阅:如何检查 std::thread 是否仍在运行?
future 等待结果并停止下一行代码
只有当你调用.get()
或未来被摧毁时,这才是正确的。您可以使用std::future
并行运行多个任务:
std::future<int> f = std::async(std::launch::async, foo);
auto res0 = bar();
auto res1 = f.get();
在上面的示例中,bar
和 foo
将并行运行。
如果要将异步延续附加到现有未来,则当前无法使用 std::future
.
boost::future
支持非阻塞.then(...)
、.when_all(...)
和.when_any(...)
延续。这些建议在"并发扩展"中进行标准化。
还有一个"协程"TS,旨在引入可恢复函数和co_await
/co_yield
。
不出所料,boost
还提供了一个协程库,目前可用于实现可恢复函数。
相关文章:
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 如何让LLDB在成功时退出,在失败时等待
- 等待整个 omp 块完成,然后再调用第二个函数
- 提升 ASIO - io_service 不要等待连接到线程
- 如何在C++中实现带有packaged_task的异步等待循环?
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- 如何等待窗口隐藏在Qt中?
- 如何在不等待检索的情况下获取C++中的内存位置?
- 等待被迷住了,没有回来
- 等待 WaitForMultipleObjects 窗口中的事件数量可变
- 一个线程等待多个线程事件
- 等待 qthread 终止的正确方法是什么?
- 不可预测的C++睡眠/等待行为
- Bison/flex 在识别规则后等待输入
- 使用记事本C++打开 txt 文件时无需等待
- 接受函数在发送数据包时等待
- 在Visual Studio中运行/调试C ++时,如何在结束时等待输入
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 在等待时破坏condition_variable
- 如何处理 RAII 中的资源等待