【发布时间】:2015-01-23 05:26:29
【问题描述】:
我担心这两段代码可能会导致隐藏的阻塞问题。对我来说,第一个有效,第二个无效。我对非工作代码不会阻塞之类的东西更有信心,但它不能正常工作。
我的问题是:这两段代码是否等效,或者我在工作代码的第一个延续中有 .get() 的事实可以使我的代码在那时阻塞?
工作代码。
auto finished = user2.ReceiveChatMessages().then([&]
(boost::future<std::vector<ServerReply>> && receivedMessages)
{
number_received_messages_in_continuation = receivedMessages.get().size();
//Will this .get make my code block in any case?
return user2.ReceiveChatMessages().get();
})
.then([&](boost::future<std::vector<ServerReply>> && receivedMessages) {
number_received_messages_in_continuation += receivedMessages.get().size();
});
无效的代码。
auto finished = user2.ReceiveChatMessages().then([&]
(boost::future<std::vector<ServerReply>> && receivedMessages)
{
number_received_messages_in_continuation = receivedMessages.get().size();
//No .get() here
return user2.ReceiveChatMessages();
}).unwrap() //We need to unwrap
.then([&](boost::future<std::vector<ServerReply>> && receivedMessages) {
number_received_messages_in_continuation += receivedMessages.get().size();
});
【问题讨论】:
-
"[...] 我有一个
.get()[...] 可以让我的代码阻塞 [...] 吗?"。除非你能保证未来必须准备好。是的,这是.get()的记录行为。 (receivedMessages是一个读取未来的例子,因为只有当它准备好时才会调用延续) -
当然,后者也是会发生的。请注意,这些不是互斥的(如果它永远不会准备好,等待它准备好可能会永远阻塞。例如,当出现死锁时(或只是程序员失败:))
-
我无法弄清楚为什么非工作代码不起作用。对于第一次继续,它甚至没有简单的返回
boost::async([] { return true });。它永远阻塞。为什么?我误解了某些东西,或者这是一个实现错误。 -
“它不起作用”是什么意思?在我看来,它甚至不应该编译。第二个延续应该是一个布尔值:
foo().then([&](boost::future<T>&&) {return true;}).then([&](boost::future<bool>&&) {});? -
api_returns_fut().then([](future<...> && r) { return boost::async([] { return true; }); }).unwrap().then([](future<bool> && r2) { ...; });。这个例子从不调用第二个延续,为什么?
标签: c++ boost concurrency