BOOST :: Future延期延续的持续僵局

Boost::Future deferred continuation unwrapping deadlocks

本文关键字:僵局 Future BOOST 延续      更新时间:2023-10-16

我正在使用Boost的promise S和future S,并在使用连续性时遇到了边缘情况。我的代码使用返回未来的延续,并在获得其值之前取消包装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替换该策略,该程序似乎死锁了。我在做什么错?

nb:只要我不 unwrap()它的值,延迟延续就可以正常工作。问题是关于未包装的延期连续性的。

我认为未来的延续与未包装配对是没有意义的。如果您使用.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。

,那将是很好的