std::future<T>::wait_until
| template< class Clock, class Duration > std::future_status wait_until( const std::chrono::time_point<Clock,Duration>& timeout_time ) const; |
(C++11以降) | |
wait_until は、結果が利用可能になるまで待機します。指定された timeout_time に到達するか、結果が利用可能になるかのいずれか早い方までブロックします。戻り値は、wait_until が返った理由を示します。
future が、遅延評価を使用した async の呼び出しの結果である場合、この関数は待機せずに直ちに返ります。
この関数呼び出しの前に valid() が false である場合、または Clock が Clock の要件を満たさない場合、動作は未定義です。プログラムは、std::chrono::is_clock_v<Clock> が false の場合、不正な形式となります。(since C++20)
目次 |
[編集] パラメータ
| timeout_time | - | ブロックする最大時間点 |
[編集] 戻り値
| Constant | 説明 |
| future_status::deferred | 共有状態には遅延評価を使用した遅延関数が含まれているため、結果は明示的に要求された場合にのみ計算されます。 |
| future_status::ready | 結果が準備完了です。 |
| future_status::timeout | タイムアウトが期限切れになりました。 |
[編集] 例外
実行中にクロック、time_point、または duration によってスローされる可能性のある例外(標準ライブラリで提供されるクロック、time_point、および duration は決して例外をスローしません)。
[編集] 注記
実装は、呼び出し前に valid() = false であるケースを検出し、エラー条件 future_errc::no_state を持つ std::future_error をスローすることが推奨されます。
timeout_time に関連付けられたクロックを使用して時間を測定することが標準で推奨されています。そのクロックは単調クロックである必要はありません。クロックが断続的に調整された場合のこの関数の動作に関する保証はありませんが、既存の実装は timeout_time を Clock から std::chrono::system_clock に変換し、POSIX pthread_cond_timedwait に委譲するため、待機はシステムクロックの調整を尊重しますが、ユーザー提供の Clock の調整は尊重しません。いずれにしても、スケジューリングやリソース競合の遅延により、関数が timeout_time を超えて待機する可能性もあります。
[編集] 例
#include <chrono> #include <future> #include <iostream> #include <thread> int main() { std::chrono::system_clock::time_point two_seconds_passed = std::chrono::system_clock::now() + std::chrono::seconds(2); // Make a future that takes 1 second to complete std::promise<int> p1; std::future<int> f_completes = p1.get_future(); std::thread([](std::promise<int> p1) { std::this_thread::sleep_for(std::chrono::seconds(1)); p1.set_value_at_thread_exit(9); }, std::move(p1) ).detach(); // Make a future that takes 5 seconds to complete std::promise<int> p2; std::future<int> f_times_out = p2.get_future(); std::thread([](std::promise<int> p2) { std::this_thread::sleep_for(std::chrono::seconds(5)); p2.set_value_at_thread_exit(8); }, std::move(p2) ).detach(); std::cout << "Waiting for 2 seconds..." << std::endl; if (std::future_status::ready == f_completes.wait_until(two_seconds_passed)) std::cout << "f_completes: " << f_completes.get() << "\n"; else std::cout << "f_completes did not complete!\n"; if (std::future_status::ready == f_times_out.wait_until(two_seconds_passed)) std::cout << "f_times_out: " << f_times_out.get() << "\n"; else std::cout << "f_times_out did not complete!\n"; std::cout << "Done!\n"; }
実行結果の例
Waiting for 2 seconds... f_completes: 9 f_times_out did not complete! Done!
[編集] 関連項目
| 結果が利用可能になるまで待機します。 (public member function) | |
| 指定されたタイムアウト時間内に結果が利用可能でない場合、待機して戻ります。 (public member function) |