gpt4 book ai didi

c++ - 如何在 C++ 中的 boost::future 中添加回调

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:39 26 4
gpt4 key购买 nike

我想实现一个功能,一旦 promise 设置值,就会调用回调函数 future 。

我正在使用 C++ boost 1.44,我已经尝试了下面的代码,但它没有像我预期的那样工作,有人可以纠正程序。

void callback_function()
{
std::cout << "Final future is ready" << std::endl;
}

int main()
{
boost::promise<std::string> promise;
boost::unique_future<std::string> fut = promise.get_future();
promise.set_wait_callback(boost::bind(Callback_function));
promise.set_value("test");

sleep(10);
}

所以这里有两个问题,

  1. 如何在上述程序中的 promise.set_value("test") 之后立即调用 callback_function。

  2. 我也试过如下将参数传递给回调函数,但是编译失败说没有匹配的函数来调用 promise...

    void callback_function( boost::unique_future<std::string> & fut)
    {

    std::cout << "Final future is ready with value" << fut.get() << std::endl;

    }

    int main()
    {
    boost::promise<std::string> promise;
    boost::unique_future<std::string> fut = promise.get_future();
    promise.set_wait_callback(boost::bind(Callback_function), boost::ref(fut));
    promise.set_value("test");
    sleep(10);
    }

添加到问题中:

为了发布代码,我在主函数中添加了 sleep ,但实际上我想在主线程中继续进行许多其他代码处理。这样主线程就不会阻塞在 fut.get 或 fut.wait 上,一旦 promise 将设置值,自动回调就会发生。我曾在 http://braddock.com/~braddock/future/current/ 中看到过这样的实现但是这个实现不是他们为 future 提供 add_callback 功能的 boost 线程的一部分。我在官方 boost 1.44 线程和 future 实现中寻找类似的东西。这将是一个非常好的功能。有一点我想再说一遍,promise 可能会在其他线程中设置。

谢谢阿比舍克

最佳答案

如果您想等待 promise 准备就绪,只需在未来调用 wait()(或其中一种变体)。这就是它的用途。

wait 回调用于通知 promise 的所有者(或“ friend ”:))有人在等待 future :

#include <boost/thread/future.hpp>

void callback_function()
{
std::cout << "Wait is called and promise not ready yet" << std::endl;
}

int main()
{
boost::promise<std::string> promise;
boost::unique_future<std::string> fut = promise.get_future();
promise.set_wait_callback(boost::bind(callback_function));

boost::thread([&]{ sleep(2); promise.set_value("test"); });
sleep(1);
std::cout << fut.get();
}

这将打印

Wait is called and promise not ready yet
test

(每行出现前 1 秒)。见<强>Live On Coliru )

回答问题2:

现在,如果您按照描述进行绑定(bind),再次访问 future 将只会导致无限递归:参见 Crash On Coliru


更新回答问题 1。

How to call callback_function immediately after the promise.set_value("test") in the above program

最简单的方法是:

promise.set_value("test");
callback_function();

认为这可能太微不足道了。所以,改为写:

boost::async([&]{ sleep(2); promise.set_value("test"); });

fut.wait(); // wait until promise is ready
callback_function(); // callback invocation

关于c++ - 如何在 C++ 中的 boost::future 中添加回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22175100/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com