あなたがstd::async
を呼び出さない限り、あなたは将来にget
またはwait
を呼び出さない限りstd::future
がfuture_status::deferred
以外の状態に設定されることはありませんようです。 wait_for
& wait_until
は、タスクがすでに実行されて結果が格納されていても、ブロックして返さずにfuture_status::deferred
を返します。ここで のstd :: STDを使用した場合、まだ延期未来:: packaged_task(VS11)
#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
残念なことに、未来的に約束から得られたVS 11 - Update 1を使用することで、残念なことに同じ遅延ステータスが得られます(非同期で動作します)。この問題は、以前にも報告されていましたが、まだ機能していません。多くの場合、std :: futureを使う目的を事実上打ち消します。少なくとも1.51のブーストで動作します。 – Ghita