编译器在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()
??
答案 0 :(得分:8)
在主要完成
之后,编译器不应该调用未来未来的析构函数
在 main
完成之前的。但是,是的。
也就是说,不应该是被调用的函数f()吗?
不,为什么?是什么让你认为std::future
的析构函数会这样做?这不是析构函数的工作。事实上,根据§30.6.6/ 9,析构函数的唯一功能是释放未来的共享状态并销毁*this
。没什么。
答案 1 :(得分:2)
这是未来的演讲(双关语意味):
FWIW,Konrad的答案仅适用于C ++ 11。在C ++ 14中,此行为已更改。根据{{3}}:
这些操作不会阻止共享状态变为就绪状态, 如果满足以下所有条件,则它可能会阻塞: 状态是通过调用std :: async创建的,尚未共享状态 准备就绪,这是对共享状态的最后引用。
即使以上引用未提及启动策略,但我只能在异步启动任务的情况下确认这种行为。根据我的测试,从std::async(std::launch::deferred, ...)
创建的,从未明确等待的期货似乎没有在破坏未来时得到评估。
还请注意,这仅与从std::async
创建的期货有关,因此,在wait();
的析构函数上附加了另外的std::future
并不是很多情况。
最后,从{1.7}起,在boost::future
创建boost::async(boost::launch::async, ...)
时,对std::future
进行了类似的更改,即未 }在C ++ 14之前完成。