【问题标题】:Is it safe to return from function before all std::futures are finished?在所有 std::futures 完成之前从函数返回是否安全?
【发布时间】:2016-04-19 23:25:06
【问题描述】:

我有这样的代码:

int function()
{
    std::vector<std::future<int>> futures;
    for (const auto& elem : elements)
    {
        futures.push_back(std::async(&MyClass::foo, myClass, elem);
    }
    for (auto& f : futures)
    {
        const int x = f.get();
        if (x != 0)
            return x;
    }
}

当有未完成的异步调用时,我可以从函数返回吗?我只对一个非零值感兴趣。我应该等到所有异步调用都完成吗?这段代码安全吗?

【问题讨论】:

  • “安全”是什么意思?
  • 我的意思是崩溃、未定义的行为或类似的东西。我只想获得第一个非零值并忽略其他值。我希望我的程序总是这样。换句话说 - 这段代码有什么危险吗?我不知道当其他异步调用完成并且vector of futures 将不存在时会发生什么。
  • 您的程序没有未定义的行为。但它可能会在返回之前阻塞所有异步操作的完成。
  • std::future 的析构函数阻塞直到异步任务完成 (see here)
  • @KerrekSB 可能吗?必须。 (不符合标准的编译器除外)

标签: c++ c++11 asynchronous future


【解决方案1】:

std::future 的析构函数(从对 std::async 的调用初始化时)会阻塞,直到异步任务完成。 (See here)

所以你的函数return 语句在所有任务完成之前不会完成。

【讨论】:

    猜你喜欢
    • 2021-08-02
    • 2014-08-25
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 2023-03-13
    • 2019-04-01
    相关资源
    最近更新 更多