boost.future: 这两段代码是等价的吗?
boost.future: are these two pieces of code equivalent?
我担心这两段代码可能会出现隐藏的阻塞问题。对我来说,第一个有效,第二个无效。我对诸如非工作代码不会阻止但无法正常工作的事情更有信心。
我的问题是:这两段代码是等效的,还是我在工作代码的第一个延续中有一个 .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();
});
由于您似乎在使用延续时遇到一般问题,让我展示一下我认为的常用模式并现场演示:
#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
#define BOOST_THREAD_PROVIDES_FUTURE
#include <boost/thread/future.hpp>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
using boost::async;
using boost::future;
int foo(int i) { return i*2; }
int main() {
auto consequence = async(boost::bind(foo, 42))
.then([&](future<int> j) { return j.get()-4; })
.then([&](future<int> k) { return k.get()/2; })
.then([&](future<int> l) { return l.get()+2; });
return consequence.get();
}
以 42
退出
这似乎是 boost.future
实现中的一个错误,它阻止了非工作代码的工作:
https://svn.boost.org/trac/boost/ticket/10964
该代码在功能上是等效的,但工作代码可能会在 return user2.ReceiveChatMessages().get()
中阻塞,因此如果继续在调用它的线程中执行,它可能会阻塞。
我不确定与非工作代码的确切区别,但我知道它是正确的。
我担心这两段代码可能会出现隐藏的阻塞问题。对我来说,第一个有效,第二个无效。我对诸如非工作代码不会阻止但无法正常工作的事情更有信心。
我的问题是:这两段代码是等效的,还是我在工作代码的第一个延续中有一个 .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();
});
由于您似乎在使用延续时遇到一般问题,让我展示一下我认为的常用模式并现场演示:
#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
#define BOOST_THREAD_PROVIDES_FUTURE
#include <boost/thread/future.hpp>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
using boost::async;
using boost::future;
int foo(int i) { return i*2; }
int main() {
auto consequence = async(boost::bind(foo, 42))
.then([&](future<int> j) { return j.get()-4; })
.then([&](future<int> k) { return k.get()/2; })
.then([&](future<int> l) { return l.get()+2; });
return consequence.get();
}
以 42
这似乎是 boost.future
实现中的一个错误,它阻止了非工作代码的工作:
https://svn.boost.org/trac/boost/ticket/10964
该代码在功能上是等效的,但工作代码可能会在 return user2.ReceiveChatMessages().get()
中阻塞,因此如果继续在调用它的线程中执行,它可能会阻塞。
我不确定与非工作代码的确切区别,但我知道它是正确的。