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
完成后立即调用futurefuture
的析构函数,也就是说,无论如何都不应该调用函数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";
}