std :: packaged_task没有破坏对破坏的承诺?

问题描述:

使用打包任务时遇到了一些非常奇怪的事情。在阅读~packaged_task时,我得到的印象是,如果std::packaged_task在执行之前被销毁,承诺将被破坏,并且试图从未来获得结果应该抛出std::future_errorstd :: packaged_task没有破坏对破坏的承诺?

但是,在Visual Studio 2013上,这似乎不是这种情况。借此下面的代码:

#include <iostream> 
#include <future> 
#include <functional> 

int main() { 
    std::future<int> f; 
    { 
     std::packaged_task<int()> task([](){return 3; }); 
     f = task.get_future(); 
    } 
    std::cout<<f.get()<<std::endl; 
    return 0; 
} 

我期待得到一个std::future_errorf.get()而是它块,等待包装任务要执行。

尝试其他编译器:http://ideone.com/Wt0WOc确实抛出一个std::future_error("Broken promise") ...

我看到在Visual Studio 2013中的错误或有我错过了什么?

你是正确。 ~packaged_task()放弃共享状态(§30.6.9.1[futures.task.members]/p9),这意味着如果共享状态没有准备好,则存储future_error类型的异常对象,其出错条件为broken_promise,然后使共享状态准备;然后释放共享状态(§30.6.4[futures.state]/p7)。

这是一个known bugwill be fixed在Visual Studio的下一个版本中,这可能会在2015年出现一段时间。它也在CTP中修复,但将它用于生产代码是一个非常糟糕的主意。

+0

所以我正确地阅读这些链接,这不会在VS 2013中修复? – 2014-09-10 10:46:16

+0

@EmilyL。我说不太可能。根据[本页FAQ部分的Q5](http://blogs.msdn.com/b/vcblog/archive/2013/06/28/c-11-14-stl-features-fixes-and-breaking -changes-in-vs-2013.aspx),他们很少回溯bug修复。 – 2014-09-10 10:46:41

+2

太棒了,我们购买的工作室还不到一年,他们已经离开了我们。 *感叹*感谢您的确认。接受这个答案,因为链接对我的怀疑进行了最后的确认。 – 2014-09-10 10:48:46

我认为这是一个bug,标准说~packaged_task放弃了共享状态,这意味着如果它还没有准备好,它应该存储一个broken_promise异常并使状态准备就绪,就像你期望的那样。

披露:您ideone.com测试使用GCC和我实现GCC的<future>,所以当我说,它的行为是正确的,我可能有偏差......但我认为这仍然是正确的;-)

+0

完全同意。被抛弃的“未来”(即这种情况下的返回值)是“broken_promise”的情况。 – starturtle 2016-06-14 07:17:07