为什么C++异步按顺序运行而没有未来

Why C++ async run sequentially without future?

本文关键字:未来 运行 顺序 C++ 异步 为什么      更新时间:2023-10-16
#include <future>
#include <iostream>
void main()
{
    std::async(std::launch::async,[] {std::cout << "async..." << std::endl; while (1);});
    std::cout << "runing main..." << std::endl;
}

在此代码中,只有"异步..."将被输出,这意味着代码在异步时被阻止。但是,如果我添加 future 并让语句变为:

std::future<bool> fut = std::async([] 
{std::cout << "async..." << std::endl; while (1); return false; });

然后一切都运行顺利(不会被阻止)。我不确定为什么会以这种方式发生。我认为异步应该在单独的线程中运行。

encppreference.com

如果从 std::async 获取的std::future没有从引用中移出或绑定到引用,则 std::future 的析构函数将在完整表达式的末尾阻塞,直到异步操作完成,实质上是使以下代码同步:

std::async(std::launch::async, []{ f(); }); // temporary's dtor waits for f()
std::async(std::launch::async, []{ g(); }); // does not start until f() completes

如果我做对了,它来自标准的以下部分(N4527):

§30.6.6 [futures.unique_future]:

~future();

影响:

— 释放任何共享状态 (30.6.4);

§30.6.4#5 [futures.state] (重点是我的):

当异步返回对象或异步提供程序被称为释放其共享状态时,这意味着:

[...].

— 这些操作不会阻止共享状态变为就绪状态,

但如果满足以下所有条件,则可能会阻止:共享状态是通过调用 std::async 创建的,共享状态尚未就绪,这是对共享状态的最后一次引用

由于您没有存储第一次std::async调用的结果,因此将调用 std::future 的析构函数,并且由于满足所有 3 个条件:

  • std::future是通过std::async创建的;
  • 共享状态尚未准备就绪(由于您的无限循环);
  • 没有关于这个未来的参考

。然后呼叫正在阻塞。