2014-09-10 121 views
15

使用打包任務時遇到了一些非常奇怪的事情。在閱讀~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中的錯誤或有我錯過了什麼?

回答

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中修復,但將它用於生產代碼是一個非常糟糕的主意。

+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

7

我認爲這是一個bug,標準說~packaged_task放棄了共享狀態,這意味着如果它還沒有準備好,它應該存儲一個broken_promise異常並使狀態準備就緒,就像你期望的那樣。

披露:您ideone.com測試使用GCC和我實現GCC的<future>,所以當我說,它的行爲是正確的,我可能有偏差......但我認爲這仍然是正確的;-)

+0

完全同意。被拋棄的「未來」(即這種情況下的返回值)是「broken_promise」的情況。 – starturtle 2016-06-14 07:17:07