2012-10-08 7 views
9

あなたがstd::asyncを呼び出さない限り、あなたは将来にgetまたはwaitを呼び出さない限りstd::futurefuture_status::deferred以外の状態に設定されることはありませんようです。 wait_for & wait_untilは、タスクがすでに実行されて結果が格納されていても、ブロックして返さずにfuture_status::deferredを返します。ここで のstd :: STDを使用した場合、まだ延期未来:: packaged_task(VS11)

は例です:私は現在のC++ 11標準を持っていない

#include <future> 

void main() 
{ 
    auto func = []() { return 5; }; 
    auto asyncFuture = std::async(std::launch::async, func); 
    auto status = asyncFuture.wait_for(std::chrono::seconds(0)); // timeout (1) 

    auto deferredFuture = std::async(std::launch::deferred, func); 
    status = deferredFuture.wait_for(std::chrono::seconds(0));  // deferred (2) 

    std::packaged_task<int()> task(func); 
    auto packagedTaskFuture = task.get_future(); 
    status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // deferred (2) 

    task(); 

    status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // deferred (2) 
    packagedTaskFuture.wait(); 
    status = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // ready (0) 
} 

が、30.6.9でのドラフト規格はpackaged_taskが実行されるとき、それは、結果を保存する必要があることを述べています未来の共有状態。予想通りの設定を含むかどうかはあまり明確ではない。wait_until/wait_for

async通話に関しては、この領域でのVS11の挙動に問題が以前ありました:他のコンパイラは、この分野での問題を持っているようhttp://social.msdn.microsoft.com/Forums/hu/parallelcppnative/thread/4394f2c1-0404-40df-869b-f4fc36fc035c

は、さらに、それはそうです:より良い標準を知っている可能性がありC++ 11 future_status::deferred not working

誰でも:これは予想される動作ですか、またはVS11の実装に問題がありますか?

アップデート:これはVS2012の問題ですhttp://connect.microsoft.com/VisualStudio/feedback/details/761829/c-11-unexpected-behavior-for-std-future-wait-for-and-std-packaged-task

+0

残念なことに、未来的に約束から得られたVS 11 - Update 1を使用することで、残念なことに同じ遅延ステータスが得られます(非同期で動作します)。この問題は、以前にも報告されていましたが、まだ機能していません。多くの場合、std :: futureを使う目的を事実上打ち消します。少なくとも1.51のブーストで動作します。 – Ghita

答えて

12

:私は何とかこのため報告書を逃しました。これは唯一の問題ではありません。C++ 11スレッドライブラリの実装にはいくつかのバグがあります。私はいくつかについて書いたon my blog

+0

ありがとう!私はVS11 C++ 11のSTLサポートがそれほど素晴らしいものではないことを知っていましたが、完全に使えないとは思わなかった。これらの機能のブーストの実装に関するコメント(明らかに非同期ではない、またはまだ実装されていないこと) –

+0

実装されている機能のために、一般的にブーストの実装は健全です。いくつかのバグがありますが、私たちはそれに取り組んでいます。そして、Vicenteは欠けているC++ 11の機能に取り組んでいます。 –

+0

@AnthonyWilliamsブーストサポートに感謝します。これに頼ることができるものです – Ghita

関連する問題