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.(начиная с C++20)
Параметры
| timeout_time | - | максимальная точка времени, до которой следует ожидать |
Возвращаемое значение
| Константа | Описание |
|---|---|
future_status::deferred | Общее состояние содержит отложенную функцию, использующую ленивое вычисление, поэтому результат будет вычислен только по явному запросу |
future_status::ready | Результат готов |
future_status::timeout | Время ожидания истекло |
Исключения
Любое исключение, выброшенное часами, точкой времени или длительностью во время выполнения (часы, точки времени и длительности, предоставляемые стандартной библиотекой, никогда не выбрасывают исключений).
Примечания
Реализациям рекомендуется обнаруживать ситуацию, когда valid() == false до вызова, и выбрасывать std::future_error с кодом ошибки future_errc::no_state.
Стандарт рекомендует использовать часы, связанные с 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!
См. также
| ожидает появления результата (открытая функция-член) |
|
| ожидает результата и возвращает управление, если он не появился в течение заданного интервала времени ожидания (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/thread/future/wait_until