Spec-Zone.ru › C++

std::shared_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::shared_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

См. также

wait
ожидает, пока результат станет доступен
(открытая функция-член)
wait_until
ожидает результат и возвращает управление, если он не стал доступен до наступления указанного момента времени
(открытая функция-член)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/thread/shared_future/wait_for

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API