std::future<T>::wait_until - cppreference.com
提供: cppreference.com
<tbody> </tbody>
|
|
(C++11以上) | |
結果が利用可能になるまで待ちます。 指定された timeout_time に達するか、結果が利用可能になるか、どちらかが先に発生するまでブロックします。 戻り値は wait_until が戻った理由を表します。
この関数を呼ぶ前に valid()== false であった場合、動作は未定義です。
引数
| timeout_time | - | ブロックする最大時点 |
戻り値
例外
実行中に clock、time_point、または duration によって投げられるあらゆる例外 (標準ライブラリによって提供される clock、time_point、および duration は、例外を投げることはありません)。
ノート
処理系は呼び出し前に valid == false であった場合を検出し、エラーコンディション future_errc::no_state を持つ future_error を投げることが推奨されます。
timeout_time に紐付く時計が使用されます。 単調増加する時計であることは要求されません。 時計が不連続的に調節された場合、この関数の動作について何の保証もありません。 既存の実装は timeout_time を Clock から std::chrono::system_clock に変換し、 POSIX の pthread_cond_timedwait に移譲するため、待機はシステム時計の調節を反映しますが、ユーザ提供の Clock は反映しません。 いずれの場合でも、スケジューリングやリソースの奪い合いによる遅延のため、この関数は timeout_time に達するまでよりも長くブロックする可能性もあります。
例
#include <iostream> #include <future> #include <thread> #include <chrono> int main() { std::chrono::system_clock::time_point two_seconds_passed = std::chrono::system_clock::now() + std::chrono::seconds(2); // Make a future that that takes 1 second to completed 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 that takes 5 seconds to completed 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!