C++异步编程,如何不等待未来

C++ async programming, how to not wait for future?

本文关键字:何不 等待 未来 异步 编程 C++      更新时间:2023-10-16

我正在尝试用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();

在上面的示例中,barfoo 将并行运行。


如果要将异步延续附加到现有未来,则当前无法使用 std::future .

boost::future支持非阻塞.then(...).when_all(...).when_any(...)延续。这些建议在"并发扩展"中进行标准化。

还有一个"协程"TS,旨在引入可恢复函数和co_await/co_yield

不出所料,boost 还提供了一个协程库,目前可用于实现可恢复函数。