C ++: добавить обратный вызов, который будет выполнен, когда будет сделано std :: future - PullRequest
1 голос
/ 26 апреля 2020

В python вы можете использовать:

future.add_done_callback(f)

f будет вызываться с будущим в качестве входного параметра, когда он имеет результат или отменяется.

Как я мог сделать что-то подобное в C ++?

1 Ответ

2 голосов
/ 26 апреля 2020

std::future имеет метод wait, который блокирует. Вызовите этот метод в фоновом потоке, когда wait возвращает, будущее готово, затем вы можете вызвать обратный вызов с готовым будущим в качестве параметра:

Некоторый код:

struct FutureCallback {
    std::thread th;

    template<class C>
    FutureCallback(C c, std::future<int> f) {
        th = std::thread(
            [c = std::move(c), f = std::move(f)]() mutable
            {
                f.wait();  // wait until future is ready
                c(f);      // call callback
            }
        );
    }

    ~FutureCallback() {
        if (th.joinable())
            th.join();
    }
};

void callback(std::future<int>& f) {
    std::cout << "res printing in callback: " << f.get();
}

int main() {
    std::packaged_task<int()> task([](){ 
        std::this_thread::sleep_for(std::chrono::seconds(5));
        return 10; 
    });
    std::future<int> f = task.get_future();
    FutureCallback cb(&callback,std::move(f));
    task();
...