名前空間
変種
操作

std::future<T>::wait_until

From cppreference.com
< cpp‎ | thread‎ | future
 
 
並行性サポートライブラリ
スレッド
(C++11)
(C++20)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
協調的なキャンセル
排他制御
(C++11)
汎用ロック管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
条件変数
(C++11)
セマフォ
ラッチとバリア
(C++20)
(C++20)
future
(C++11)
(C++11)
(C++11)
(C++11)
安全なメモリ解放 (Safe Reclamation)
(C++26)
ハザードポインタ
アトミック型
(C++11)
(C++20)
アトミック型の初期化
(C++11)(C++20で非推奨)
(C++11)(C++20で非推奨)
メモリオーダー
(C++11)(C++26で非推奨)
アトミック操作のためのフリー関数
アトミックフラグのためのフリー関数
 
 
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 である場合、または ClockClock の要件を満たさない場合、動作は未定義です。プログラムは、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_timeClock から 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) [編集]
English 日本語 中文(简体) 中文(繁體)