BOOST :: Future延期延续的持续僵局
Boost::Future deferred continuation unwrapping deadlocks
我正在使用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。
相关文章:
- 架构决策:返回std::future还是提供回调
- 使用用户定义的参数调用future/async并调用类方法
- std::p romise::set_value() 和 std::future::wait() 是否提供内存围栏?
- 修改在 std::future 的 lambda 中引用捕获的值
- 从 T 创建 std::future 的最佳方式<T>
- C++ std::future没有被调用
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 如何使用 boost::future 重新抛出 std::exception_ptr 存储的原始异常?
- Make zmqpp::socket::connect a std::future
- std::future可以比std::promise活得更长吗
- std::future::get()或std::future::wait()是std::thread::join()的替
- 使用 future 时获取 C2280(尝试引用已删除的函数)
- 当 std::future 准备好被检索时发出信号主线程
- C++ std::future 方法应该<T>命名为 is_ready() 还是 ready()?
- 为什么printf会导致与future.get的死锁,而cout则不会?
- 当多次调用时,"std::future::then"的行为是什么?
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- 使用 std::future 的不完整类型无效使用
- boost::future::那它是如何实现的?
- BOOST :: Future延期延续的持续僵局