3

future编译器不应该在完成后立即调用未来的析构函数main,也就是说,不应该是f()调用的函数吗?(gcc 4.7.2 不这样做)。

#include <iostream>
#include <thread>
#include <future>

using namespace std;

void f() {
    cout << "thread...\n";
}

int main() {
    auto future = async(&f);
    cout << "I am main\n";
}

编辑:我 Hello from main得到。文本thread...根本不打印。

编辑2:未来调用的析构函数wait()吗?

4

2 回答 2

8

注意:下面的过时信息(C++ 14 之前)。有关最新信息,请参阅 Jonas 的答案。


编译器不应该在 main 完成后立即调用未来 future 的析构函数

main完成之前。但是,是的。

也就是说,无论如何都不应该调用函数 f() 吗?

没有为什么?是什么让你认为析构函数std::future会这样做?这不是析构函数的工作。事实上,根据§30.6.6/9,析构函数的唯一作用是释放未来的共享状态并销毁*this。而已。

于 2012-11-29T22:27:00.120 回答
2

这是未来的说法(双关语):

FWIW,康拉德的回答仅适用于 C++11。在 C++14 中,这种行为发生了变化。根据cppreference

这些操作不会阻塞共享状态准备就绪,除非满足以下所有条件时它可能会阻塞:共享状态是通过调用 std::async 创建的,共享状态尚未准备好,并且这是对共享状态的最后引用。

尽管上面的引用没有提到启动策略,但我只能在任务异步启动的情况下确认这种行为。std::async(std::launch::deferred, ...)根据我的测试,从未明确等待过的未来似乎不会在未来的破坏时得到评估。

另请注意,这仅适用于从 创建的期货std::async,因此wait();std::future.

最后,从 Boost 1.73 开始,在创建时没有对 进行类似的更改,即 Boost 版本的行为仍与 C++14 之前的版本相同。boost::futureboost::async(boost::launch::async, ...)std::future

于 2020-05-14T09:27:43.037 回答