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

时间:2012-11-29 22:24:46

标签: c++ gcc c++11

编译器在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() ??

2 个答案:

答案 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之前完成。