std::packaged_task<R(Args...)>::make_ready_at_thread_exit
来自cppreference.com
< cpp | thread | packaged task
void make_ready_at_thread_exit( ArgTypes... args ); |
(C++11 起) | |
如同以 INVOKE<R>(f, args...) 调用存储的任务 f。任务返回值或任何抛出的异常被存储于 *this 的共享状态。
只有在在当前线程退出,并销毁所有线程局域存储期对象后,共享状态才会就绪。
参数
args | - | 调用时传递给存储任务的形参 |
返回值
(无)
异常
在以下情况下抛出 std::future_error:
- 存储的任务已经调用过。此时设置错误类别为
promise_already_satisfied
。 - *this 没有共享状态。设此时设置错误类别为 no_state。
示例
运行此代码
#include <chrono> #include <functional> #include <future> #include <iostream> #include <memory> #include <thread> #include <utility> struct ProgramState { std::packaged_task<void()> task; std::future<void> future; std::thread worker; }; static void worker(std::shared_ptr<ProgramState> state) { state->task.make_ready_at_thread_exit(); // 立即执行任务 auto status = state->future.wait_for(std::chrono::seconds(0)); if (status == std::future_status::timeout) std::cout << "worker:未来体尚未就绪\n"; else std::cout << "worker:未来体已经就绪\n"; std::cout << "worker:退出\n"; } static std::shared_ptr<ProgramState> create_state() { auto state = std::make_shared<ProgramState>(); state->task = std::packaged_task<void()>{[] { std::cout << "task: 已执行\n"; }}; state->future = state->task.get_future(); state->worker = std::thread{worker, state}; return state; } int main() { auto state = create_state(); state->worker.join(); std::cout << "main: worker 完成\n"; auto status = state->future.wait_for(std::chrono::seconds(0)); if (status == std::future_status::timeout) std::cout << "main:未来体尚未就绪\n"; else std::cout << "main:未来体已经就绪"; }
输出:
task: 已执行 worker:未来体尚未就绪 worker:退出 main: worker 完成 worker:结果尚未就绪 main:未来体已经就绪
参阅
执行函数 (公开成员函数) |