2012-03-16 60 views
17

我对std::async功能的行为与std::launch::async政策从异步返回& std::future对象的一些问题。性病的行为::异步用的std ::推出::异步政策

在以下代码中,主线程等待完成foo()async创建的线程的调用。

#include <thread> 
#include <future> 
#include <iostream> 

void foo() 
{ 
    std::cout << "foo:begin" << std::endl; 
    std::this_thread::sleep_for(std::chrono::seconds(10)); 
    std::cout << "foo:done" << std::endl; 
} 

int main() 
{ 
    std::cout << "main:begin" << std::endl; 
    { 
    auto f = std::async(std::launch::async, foo); 
    // dtor f::~f blocks until completion of foo()... why?? 
    } 
    std::this_thread::sleep_for(std::chrono::seconds(2)); 
    std::cout << "main:done" << std::endl; 
} 

而且我知道http://www.stdthread.co.uk/doc/headers/future/async.html

与返回性病的 异步状态相关联的最后一个未来对象的析构函数::未来应阻止,直到 未来做好准备。

我的问题是:

  • Q1。这种行为是否符合当前的C++标准?第二季度销售价格为
  • 。如果Q1的答案是肯定的,哪些陈述说?
+0

这个标准的惊人之处在于,经常一个脚注完全改变了一个章节...... – orlp 2012-03-16 07:39:07

回答

16

是的,这是C++标准所要求的。 30.6.8 [futures.async]段5,最终子弹:

- 相关线程完成与(1.10)的从成功地检测到共享状态或与返回就绪状态的第一函数的返回同步从最后一个释放共享状态的函数中,以先发生者为准。

唯一的std:future的析构函数满足该条件,因此必须等待线程的完成。

+1

OP的代码在VS2012中不起作用。它不会阻止'将来'析构函数。这是一种错误,还是微软只是接受了Sutter的建议,不要阻止dtors? – 2013-02-24 10:30:03

+0

微软选择实施Herb Sutter的建议,不要在析构函数中阻止。 – 2013-02-24 17:48:43

+0

这种行为是一个大问题,但我担心现在修复标准为时已晚。微软选择实施非标准行为是因为他们不同意这一点,这只会让跨平台开发人员感到困难。 – cdmh 2013-04-15 16:29:54