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
返回的原因。
如果该 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); // 创建一个需要1秒完成的future 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(); // 创建一个需要5秒完成的future 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 未完成! 完成!
参见
|
等待结果变为可用
(公开成员函数) |
|
|
等待结果,若在指定的超时时间内结果不可用则返回
(公开成员函数) |