Когда вы вызываете функцию spawn
, вы передаете в качестве первого аргумента контекст выполнения (как экземпляр класса io_context
). Внутри этого объекта, строго внутри io_context::run
метода выполняется функция сопрограммы.
Все, что вам нужно подождать до завершения сопрограммы, это вызвать run
на io_context
- при условии, что вы не использовали этот объект io
для запуска некоторых других асинхронных задач (поэтому вы должны создать выделенный io_context
экземпляров для ваших сопрограмм).
Если вы хотите обрабатывать несколько сопрограмм, вам нужно вызвать фоновые потоки run
метод.
boost::asio::spawn(io, other_1_coroutine);
boost::asio::spawn(io, other_2_coroutine);
// join section:
std::thread th( [&](){ io.run(); } );
io.run();
th.join();
continue_do_something();
в приведенном выше коде, мы создать один поток с вызовом run
. Таким образом, два вызова run
работают одновременно и выполняют обе запущенные сопрограммы.
Демо (это не 1: 1 с вашим кодом, но оно показывает, как вы можете присоединиться к сопрограммам).