I want to have chain of asynchronous calls using boost::coroutine
.
I've started with the simplest solution.
My async methods are:
class C
{
void function1(boost::coroutines::symmetric_coroutine<int>::call_type& coro, boost::coroutines::symmetric_coroutine<int>::yield_type& yield)
{
thread1 = std::thread([&](){ std::cout << "function1" << std::endl; yield(coro, 100); });
}
void function2(boost::coroutines::symmetric_coroutine<int>::call_type& coro, boost::coroutines::symmetric_coroutine<int>::yield_type& yield)
{
thread2 = std::thread([](){ std::cout << "function2" << std::endl; });
}
void C::run()
{
boost::coroutines::symmetric_coroutine<int>::call_type coro_b(
[&](boost::coroutines::symmetric_coroutine<int>::yield_type& yield)
{
std::cout << "b entry" << std::endl;
function2(coro_b, yield);
yield();
std::cerr << "Never get this" << std::endl;
std::cout << yield.get() << std::endl;
});
boost::coroutines::symmetric_coroutine<int>::call_type coro_a(
[&](boost::coroutines::symmetric_coroutine<int>::yield_type& yield)
{
std::cout << "a entry" << std::endl;
function1(coro_b, yield);
yield();
});
coro_a(2);
coro_b(3);
std::this_thread::sleep_for(std::chrono::minutes(1));
}
private:
std::thread thread1;
std::thread thread2;
};
int main()
{
C c;
c.run();
return 0;
}
My output:
a entry
b entry
function2
function1
And I have an error:
main_tests: /usr/include/boost/coroutine/detail/symmetric_coroutine_impl.hpp:159: R* boost::coroutines::detail::symmetric_coroutine_impl<R>::yield_to_(Other*, typename Other::param_type*) [with Other = boost::coroutines::detail::symmetric_coroutine_impl<int>; R = int; typename Other::param_type = boost::coroutines::detail::parameters<int>]: Assertion is_running()' failed. The program has unexpectedly finished.
I just try to call coro_b
when coro_a
is finished (exactly when asynchronous function in coro_a
is finished)....
Aucun commentaire:
Enregistrer un commentaire