Namespaces
Variants

std::shared_future<T>:: wait_for

From cppreference.net

Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
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

参阅

等待结果变为可用
(公开成员函数)
等待结果,若在到达指定时间点后结果仍不可用则返回
(公开成员函数)