web-dev-qa-db-ja.com

std :: futureのステータスを取得します

std::futureが終了したかどうかを確認することはできますか?私ができる唯一の方法は、ゼロの持続時間でwait_forを呼び出し、ステータスがreadyであるかどうかを確認することですが、より良い方法はありますか?

67
David Brown

あなたは正しいですし、wait_until過去の時刻(これは同等)を使用するより良い方法はありません。

より便利な構文が必要な場合は、常に小さなラッパーを作成できます。

template<typename R>
  bool is_ready(std::future<R> const& f)
  { return f.wait_for(std::chrono::seconds(0)) == std::future_status::ready; }

N.B.関数が延期された場合、これは決してtrueを返さないので、おそらくwait_for特定の時間が経過した後、またはシステムの負荷が低いときに、遅延タスクを同期的に実行したい場合に直接。

66
Jonathan Wakely

Is_readyメンバー関数があります 作業中 std :: future用です。それまでの間、VC実装には_Is_ready()メンバーがあります。

10
Rick Yorgason

私の最初の賭けは、期間が0の_wait_for_を呼び出し、_future_status::ready_、_future_status::deferred_、または_future_status::timeout_のいずれかである可能性のある結果コードを確認することです。

cppreference では、valid()と主張しています結果が利用可能かどうかをチェックですが、標準ではvalid()trueを返します_*this_が共有状態を参照する場合、その状態がreadyであるかどうかに関係なく。