C++ 异步C++;11

C++ 异步C++;11,c++,gcc,c++11,C++,Gcc,C++11,编译器不应该在main完成后立即调用futurefuture的析构函数,也就是说,无论如何都不应该调用函数f()?(gcc 4.7.2没有这样做) #包括 #包括 #包括 使用名称空间std; void f(){ cout注意:下面是过时的信息(C++14之前)。有关最新信息,请参见Jonas的答案 编译器不应该在主程序完成后立即调用未来的析构函数吗 就在main完成之前。但是是的 也就是说,无论如何都不应该调用函数f() 不,为什么?是什么让你认为未来的析构函数会这么做?这不是析构函数的工作

编译器不应该在
main
完成后立即调用future
future
的析构函数,也就是说,无论如何都不应该调用函数
f()
?(gcc 4.7.2没有这样做)

#包括
#包括
#包括
使用名称空间std;
void f(){

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


编译器不应该在主程序完成后立即调用未来的析构函数吗

就在
main
完成之前。但是是的

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

不,为什么?是什么让你认为未来的析构函数会这么做?这不是析构函数的工作。事实上,根据§30.6.6/9,析构函数的唯一功能是释放未来的共享状态并销毁这个

这就是未来(双关语):

FWIW,Konrad的答案仅适用于C++11。在C++14中,此行为已更改。根据:

这些操作不会阻止共享状态就绪, 除非它可能会阻止以下所有情况:共享 状态是通过调用std::async创建的,共享状态尚未创建 准备好了,这是对共享状态的最后一次引用

尽管上面的引用没有提到启动策略,但我只能在异步启动任务的情况下确认此行为根据我的测试,那些从未被明确等待过的东西似乎不会在未来被破坏时得到评估

还要注意的是,这只适用于从
std::async
创建的未来,因此在
std::future
的析构函数上附加
wait();
的情况非常不同


最后,从Boost 1.73开始,类似的更改是由Boost::async(Boost::launch::async,…)创建的,而不是为Boost::future,也就是说,Boost版本的行为仍然像C++14之前的版本一样。

在我的机器上,
线程…
没有打印出来(Ubuntu 12.10,gcc 4.7.2)@Martin是的。你为什么希望它被打印出来?@Martin:是的。只有当你实际使用
std::future::wait
std::future::get
(尽管后者只调用第一个)等待函数时,才会发生这种情况。请看IIRC,它是否被更改,以便future的析构函数调用
wait()
?我现在正在搜索,但我认为情况就是这样…@GManNickG,确实在C++14中做了一个改变,改变了行为,但不仅仅是调用
wait()
在析构函数中。我添加了一个答案来澄清这些事情,这是事后诸葛亮的结果。当我在C++14下尝试下面的测试时,未来的析构函数似乎仍然会阻塞。您的答案暗示您已测试并看到它没有阻塞?
#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";
}