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

时间:2014-09-10 10:08:06

标签: c++ c++11 visual-studio-2013 future packaged-task

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

但是,在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_error上获得f.get(),而是阻止它,等待打包的任务被执行。

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

我在Visual Studio 2013中看到了一个错误,或者我错过了哪些内容?

2 个答案:

答案 0 :(得分:10)

你是对的。 ~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中得到修复,但这是一个非常糟糕的主意将其用于生产代码...

答案 1 :(得分:7)

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

完全披露:你的ideone.com测试使用GCC并且我实现了GCC的<future>所以当我说它的行为是正确的时候我可能会有偏见......但我认为它仍然是正确的; - )

相关问题