std::future<T>:: wait_until
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Getting the result | ||||
| State | ||||
|
future::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
завершил работу.
Если будущий объект является результатом вызова 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 | Время ожидания истекло |
Исключения
Любое исключение, выброшенное clock, time_point или duration во время выполнения (часы, временные точки и длительности, предоставляемые стандартной библиотекой, никогда не выбрасывают исключений).
Примечания
Реализациям рекомендуется обнаруживать случай, когда 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); // Создать future, который завершится через 1 секунду 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(); // Создать future, который завершится через 5 секунд 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 << "Ожидание 2 секунды..." << 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 не завершился!\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 не завершился!\n"; std::cout << "Готово!\n"; }
Возможный вывод:
Ожидание 2 секунды... f_completes: 9 f_times_out не завершился! Готово!
Смотрите также
|
ожидает, пока результат станет доступным
(публичная функция-член) |
|
|
ожидает результат, возвращает управление, если результат недоступен в течение указанного времени ожидания
(публичная функция-член) |