boost.future:这两段代码是等价的吗?

时间:2015-01-23 05:26:30

标签: c++ boost concurrency

我担心这两段代码可能会产生隐藏的阻塞问题。对我来说,第一个是工作,第二个不是。我对非工作代码不会阻塞,但它无法正常工作的事情更有信心。

我的问题是:这两段代码是等效的还是我在工作代码的第一个延续中有.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();
});

2 个答案:

答案 0 :(得分:0)

由于您似乎在使用延续时遇到一般性问题,让我展示一下我认为通常的模式并展示它:

<强> Live On Coliru

#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

答案 1 :(得分:0)

boost.future实施中的一个错误似乎是阻止非工作代码工作的错误:

https://svn.boost.org/trac/boost/ticket/10964

代码在功能上是等效的,但是工作代码可能在return user2.ReceiveChatMessages().get()中阻塞,所以如果在调用它的线程中执行continuation,它可能会阻塞。

我不确定与非工作代码的确切区别,但我知道它是正确的。