[英]Destructor of a future in async C++11
编译器不应该在main
完成后立即调用未来future
的析构函数,也就是说,无论如何都不应该调用函数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()
吗?
注意:以下是过时的信息(C++14 之前)。 有关最新信息,请参阅乔纳斯的回答。
编译器不应该在 main 完成后立即调用 future 的析构函数吗
就在main
完成之前。 但是,是的。
也就是说,无论如何都不应该调用函数 f() 吗?
没有为什么? 是什么让您认为std::future
的析构函数会那样做? 这不是析构函数的工作。 事实上,根据§30.6.6/9,析构函数的唯一功能是释放未来的共享状态并销毁*this
。 而已。
这是未来的说法(双关语意):
FWIW,康拉德的回答只适用于 C++11。 在 C++14 中,这种行为发生了变化。 根据cppreference :
这些操作不会阻止共享状态变为就绪,但如果以下所有条件为真,它可能会阻塞:共享状态是通过调用 std::async 创建的,共享状态尚未准备好,并且此是对共享状态的最后引用。
尽管上面的引用没有提到启动策略,但我只能在任务异步启动的情况下确认这种行为。 根据我的测试,从std::async(std::launch::deferred, ...)
创建的从未明确等待的期货似乎不会在未来被破坏时得到评估。
另请注意,这仅适用于从std::async
创建的期货,因此额外的wait();
几乎不是这种情况。 被打到std::future
的析构函数上。
最后,从 Boost 1.73 开始, boost::future
没有进行类似的更改,当由boost::async(boost::launch::async, ...)
创建时,即 Boost 版本的行为仍然像std::future
做了 C++14 之前的工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.