名前空間
変種
操作

std::future<T>::wait_until

提供: cppreference.com
< cpp‎ | thread‎ | future
 
 
スレッドサポートライブラリ
スレッド
(C++11)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
相互排他
(C++11)
汎用ロック管理
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
条件変数
(C++11)
フューチャー
(C++11)
(C++11)
(C++11)
(C++11)
 
 
template< class Clock, class Duration >
std::future_status wait_until( const std::chrono::time_point<Clock,Duration>& timeout_time ) const;
(C++11以上)

結果が利用可能になるまで待ちます。 指定された timeout_time に達するか、結果が利用可能になるか、どちらかが先に発生するまでブロックします。 戻り値は wait_until が戻った理由を表します。

この関数を呼ぶ前に valid()== false であった場合、動作は未定義です。

目次

[編集] 引数

timeout_time - ブロックする最大時点

[編集] 戻り値

定数 説明
future_status::deferred 結果を計算するための関数はまだ開始されていません
future_status::ready 結果は準備完了しています
future_status::timeout タイムアウトが経過しました

[編集] 例外

実行中に clock、time_point、または duration によって投げられるあらゆる例外 (標準ライブラリによって提供される clock、time_point、および duration は、例外を投げることはありません)。

[編集] ノート

処理系は呼び出し前に valid == false であった場合を検出し、エラーコンディション future_errc::no_state を持つ future_error を投げることが推奨されます。

timeout_time に紐付く時計が使用されます。 単調増加する時計であることは要求されません。 時計が不連続的に調節された場合、この関数の動作について何の保証もありません。 既存の実装は timeout_timeClock から 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!

[編集] 関連項目

結果が利用可能になるのを待ちます
(パブリックメンバ関数) [edit]
結果を待ちます。 指定されたタイムアウト期間が満了するまで利用可能にならなければリターンします
(パブリックメンバ関数) [edit]