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


82

std::futureが終了したかどうかを確認することはできますか?私が知る限り、それを行う唯一の方法wait_forは、ゼロの期間で電話をかけ、ステータスがそうであるかどうかを確認することreadyですが、より良い方法はありますか?


10
@CatPlusPlus私が間違っていない限りvalid、futureに共有状態があるかどうかだけをチェックします(つまり、futureで呼び出されるtrueまで戻りますget)。
デビッドブラウン

それで、get呼び出されて保存された値を返す場合でも、必要trueですか?(値を取得できるのは1回だけなので、なぜこれが役立つのか
わかり

@JamesMcNellis先物を誤解している、または誤用している可能性がありますが、スレッド(または計算を実行しているもの)が終了したかどうかを知りたいのです。QFuture::isFinished基本的にQtと同等です。
デビッドブラウン

1
タイムアウトがゼロの待機は、多くのプラットフォームのほとんどのAPIがそのような概念を処理する方法です...私はそれを概念にアプローチする「標準的な」方法と考えるほどです。これは...ビットは「より良い方法」の概念に戸惑う私を作る
asveikau

16
@asveikauこれが標準的な方法だとは知りませんでした。待ちたくないときにwait関数を呼び出すのは奇妙に感じます。
デビッドブラウン

回答:


84

あなたは正しいです、そして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; }

注意:関数が延期された場合、これはtrueを返すことはありません。したがってwait_for、一定の時間が経過した後、またはシステムの負荷が低いときに延期されたタスクを同期的に実行する場合は、直接確認することをお勧めします。


2
wait_forはfutureを変更しないため、パラメーターをconstとして宣言できます。
イェンスÅkerblom

7
getがすでに呼び出されている場合、またはfutureが初期化されていない場合は、実行時エラーを回避するために、最初にvalid()をチェックすることを検討してください。
Jeremy Sorensen 2015

5
wait_for(chrono :: seconds(0))はすぐに戻ることが保証されていますか、それとも一部の実装では数ミリ秒の間スレッドの制御を譲ることができますか?ゲームをコーディングする場合、数ミリ秒は多くの時間であるため、これを知ることは非常に重要です...
kynnysmatto 2015

9
@kynnysmatto、一部の実装では、将来の状態を安全に検査するためにミューテックスロックを取得するため、そのロックが競合すると(別のスレッドが状態を準備しているため、または準備ができているかどうかを確認しているため)、ブロックされ、別のスレッド実行できますが、適切な実装では、ミューテックスを数命令以上保持しないでください。1ミリ秒も保持しないでください。GCCの現在の実装ではミューテックスをまったく使用していませんが、前の実装ではミューテックスを使用しており、状態の準備は2つのポインターを交換することで行われるため、ミューテックスはごく短時間だけロックされます。
Jonathan Wakely 2015

@JonathanWakelyをg ++でテストするにfor(int i = 0; i < 1000; i++) f.wait_for(chrono::seconds(0));は、43ミリ秒の実時間がかかります。
ダニエルキンズマン

14

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


_Is_ready()メンバー関数はスレッドセーフではないことに注意してください。保護されていない方法で、関連付けられた状態の_Readyフラグにアクセスします。これは少なくともVS201916.2の場合です。
Mattias De Charleroy

9

私の最初の賭けは、呼び出すことであろうwait_for0期間とし、のいずれかにすることができ、結果コードを確認しfuture_status::readyfuture_status::deferredfuture_status::timeout

cppreference彼らは主張するvalid() 結果が利用可能な場合はチェックを、標準的なは、それは言うvalid()返されtrueた場合*this、独立してその状態があるかどうかの、共有状態を指し、準備ができてきません。


7
cppreferenceが更新され、「futureに共有状態があるかどうかを確認する」と記載されています。(2番目の段落を削除するか編集するかわからないため、自分で変更することはありません)。
デフォルト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.