Spec-Zone.ru › C++

std::packaged_task<R(Args...)>::make_ready_at_thread_exit

void make_ready_at_thread_exit( Args... 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(); // execute task right away
    
    auto status = state->future.wait_for(std::chrono::seconds(0));
    if (status == std::future_status::timeout)
        std::cout << "worker: future is not ready yet\n";
    else
        std::cout << "worker: future is ready\n";
    
    std::cout << "worker: exit\n";
}

static std::shared_ptr<ProgramState> create_state()
{
    auto state = std::make_shared<ProgramState>();
    state->task = std::packaged_task<void()>{[]
    {
        std::cout << "task: executed\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 finished\n";
    
    auto status = state->future.wait_for(std::chrono::seconds(0));
    if (status == std::future_status::timeout)
        std::cout << "main: future is not ready yet\n";
    else
        std::cout << "main: future is ready\n";
}

Вывод:

task: executed
worker: future is not ready yet
worker: exit
main: worker finished
main: future is ready

См. также

operator()
выполняет функцию
(открытая функция-член)

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

Spec-Zone.ru

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