繁体   English   中英

异步 C++11 中未来的析构函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM