std::future<T>::wait_for
template< class Rep, class Period > std::future_status wait_for( const std::chrono::duration<Rep,Period>& timeout_duration ) const; | (начиная с C++11) |
Ожидает, пока результат станет доступен. Блокирует выполнение до истечения указанного timeout_duration или до момента, когда результат станет доступен, в зависимости от того, что произойдёт раньше. Возвращаемое значение указывает состояние результата.
Если future является результатом вызова std::async с ленивым вычислением, эта функция возвращает управление немедленно, не ожидая результата.
Из-за задержек при планировании или конкуренции за ресурсы эта функция может блокировать выполнение дольше, чем timeout_duration.
Стандарт рекомендует использовать монотонные часы для измерения длительности. Если реализация вместо этого использует системные часы, на время ожидания также могут влиять корректировки часов.
Поведение не определено, если перед вызовом этой функции valid() имеет значение false.
Параметры
| timeout_duration | - | максимальная длительность блокировки |
Возвращаемое значение
| Константа | Описание |
|---|---|
future_status::deferred | Общее состояние содержит отложенную функцию с ленивым вычислением, поэтому результат будет вычислен только по явному запросу |
future_status::ready | Результат готов |
future_status::timeout | Время ожидания истекло |
Исключения
Любое исключение, выброшенное часами, точкой времени или длительностью во время выполнения (часы, точки времени и длительности из стандартной библиотеки никогда не выбрасывают исключений).
Примечания
Реализациям рекомендуется обнаруживать случай, когда valid == false до вызова, и выбрасывать std::future_error с кодом ошибки std::future_errc::no_state.
Пример
#include <chrono>
#include <future>
#include <iostream>
#include <thread>
using namespace std::chrono_literals;
int main()
{
std::future<int> future = std::async(std::launch::async, []()
{
std::this_thread::sleep_for(3s);
return 8;
});
std::cout << "waiting...\n";
std::future_status status;
do
{
switch (status = future.wait_for(1s); status)
{
case std::future_status::deferred:
std::cout << "deferred\n";
break;
case std::future_status::timeout:
std::cout << "timeout\n";
break;
case std::future_status::ready:
std::cout << "ready!\n";
break;
}
}
while (status != std::future_status::ready);
std::cout << "result is " << future.get() << '\n';
}
Возможный вывод:
waiting... timeout timeout timeout ready! result is 8
См. также
| ожидает, пока результат станет доступен (открытая функция-член) |
|
| ожидает результат и возвращает управление, если он не стал доступен до наступления указанного момента времени (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/thread/future/wait_for