我正在使用Boost的promise
和future
,并在使用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()
其值,延迟延续就能正常工作。问题特别是关于展开的延期延续。
答案 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的开发人员,那就太好了。