boost :: asio как порождает несколько сопрограмм, а затем присоединяется к ним? - PullRequest
0 голосов
/ 24 февраля 2020

Я использую boost :: asio, мой код такой:

void my_coroutine(boost::asio::io_context& io, boost::asio::yield_context yield)
{
        boost::asio::spawn(io, other_1_coroutine);
        boost::asio::spawn(io, other_2_coroutine);
        async_wait(other_1 and other_2);
        continue_do_something();
}

Я хочу, чтобы одновременно вызывалось 2 или более сопрограмм, а затем asyn c ждут их всех. я пробовал сопрограмму TS, но g ++ пока не поддерживает. Как я могу достичь этого?

1 Ответ

0 голосов
/ 24 февраля 2020

Когда вы вызываете функцию 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 с вашим кодом, но оно показывает, как вы можете присоединиться к сопрограммам).

...