Boost :: Future延迟延续解开死锁

时间:2017-06-25 16:56:17

标签: c++ c++11 boost promise deadlock

我正在使用Boost的promisefuture,并在使用continuation时遇到了边缘情况。我的代码使用了一个返回未来的延续,并在获取其值之前解包then()的结果。

#define BOOST_THREAD_VERSION 5

#include <iostream>
#include <boost/thread/future.hpp>

int main(int argc, char* argv[])
{
    boost::promise<int> promise;
    boost::future<int> future = promise.get_future();

    promise.set_value(42);

    int result = future.then(
        boost::launch::async,
        [](boost::future<int> result)
        {
            return boost::make_ready_future(result.get());
        }
    ).unwrap().get();

    std::cout << "Result is: " << result << std::endl;
    return 0;
}

在这个例子中,我明确地使用boost::launch::async策略在新线程中启动延续,我得到预期的结果为42。

但是,一旦我用boost::launch::deferred替换该政策,该计划似乎就陷入僵局。我做错了什么?

注意:只要我没有unwrap()其值,延迟延续就能正常工作。问题特别是关于展开的延期延续。

1 个答案:

答案 0 :(得分:2)

我认为未来的延续与展开搭配没有意义。如果您使用.then创建未来,您将获得有效的未来。所以你可以不加阻塞地调用.get()。这就是为什么我不认为需要嵌套的未来。但是,你编写它的方式不应该导致死锁,这可能是一个错误。

#define BOOST_THREAD_VERSION 5

#include <iostream>
#include <boost/thread/future.hpp>

int main(int argc, char* argv[])
{
    boost::promise<int> promise;
    boost::future<int> future = promise.get_future();

    promise.set_value(42);

    int result = future.then(
        boost::launch::deferred,
        [](boost::future<int> result)
        {
            return result.get(); // get is non-blocking, since it is a continuation
        }
    )/*.unwrap()*/.get();

    std::cout << "Result is: " << result << std::endl;
    return 0;
}

从增强1.64开始,unwrap仍然是一个实验函数。如果你将此行为传达给boost :: thread的开发人员,那就太好了。