boost :: future и продолжений — значение установлено, но будущее все еще блокирует

Я пытаюсь сделать следующее продолжение работы — но f.get() блоки. В чем дело?

#include <iostream>

#define BOOST_THREAD_PROVIDES_FUTURE
#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
#include <boost/thread/future.hpp>

struct Foo {

boost::future<int> start() {
return p.get_future();
}

void finish() {
p.set_value(23);
}

boost::promise<int> p;
};

int main () {

Foo foo;

foo.start().then([](boost::future<int> f) {
std::cout << "done:" << std::endl;
std::cout << f.get() << std::endl;
});

foo.finish();
}

Это напечатает "done:", так что будущее стреляет, но потом оно просто «зависнет» f.get() .. Я потерян.

Строить:

clang++ -o test8 -std=c++11 -stdlib=libc++ -lboost_thread -lboost_system \
-I/home/oberstet/boost_1_55_0 -L/home/oberstet/boost_1_55_0/stage/lib \
test8.cpp

ОБНОВИТЬ: Следующее изменение кода заставит пример работать — но почему? поскольку f2 не используется в любом случае. Снова озадачен.

   boost::future<void> f2 = foo.start().then([](boost::future<int> f) {
std::cout << "done:" << std::endl;
std::cout << f.get() << std::endl;
});

ОБНОВЛЕНИЕ 2: Добавление политики запуска launch::deferred, также будет работать:

   foo.start().then(boost::launch::deferred, [](boost::future<int> f) {
std::cout << "done:" << std::endl;
std::cout << f.get() << std::endl;
});

и это также:

   boost::future<int> start() {
boost::future<int> f = p.get_future();
f.set_deferred();
return f;
}

2

Решение

Проблема в том, что твое спокойное будущее не сохраняется. На самом деле, это временно и разрушается, как только .then()) заканчивается.

Почини это:

int main () {
Foo foo;

auto f1 = foo.start();
auto f2 = f1.then([](boost::future<int> f) {
std::cout << "done:" << std::endl;
std::cout << f.get() << std::endl;
});

foo.finish();
f2.get();
}

Теперь печатает

done:
23

Видеть это Жить на Колиру

Если вы переместите f2.get() перед foo.finish() он снова заблокируется.

3

Другие решения

Других решений пока нет …