Я пытаюсь вызвать boost::asio::spawn
дважды к одному и тому же boost::asio::io_context::strand
, передавая сопрограмму каждый раз, и я ожидал, что две сопрограммы будут выполняться одна за другой, но вместо этого они выполняются параллельно. Вот код, который иллюстрирует это:
boost::asio::io_context ioc;
boost::asio::io_context::strand strand{ioc};
boost::asio::spawn(strand, [&](boost::asio::yield_context yield)
{
cout << "1\n";
ioc.post(yield);
cout << "2\n";
ioc.post(yield);
cout << "3\n";
});
boost::asio::spawn(strand, [&](boost::asio::yield_context yield)
{
cout << "10\n";
ioc.post(yield);
cout << "20\n";
ioc.post(yield);
cout << "30\n";
});
ioc.run();
Это выводит:
1
10
2
20
3
30
Когда я ожидал:
1
2
3
10
20
30
В реальном коде первая сопрограмма устанавливает сокет (выполняет действия по разрешению / соединению / рукопожатию), а вторая выполняет отправку / получение. Мое намерение состояло в том, чтобы «добавить» вторую цепочку к цепочке и запустить ее только после завершения первой.
Как мне добиться этого эффекта?
Редактировать: больше контекста. Первая сопрограмма находится в конструкторе, вторая в функции-члене. Если я хочу разрешить пользователю писать
Foo foo;
foo.bar();
как я могу убедиться, что сопрограмма внутри конструктора завершена до того, как запустится функция в bar ()?