我试图调用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() 中的协程开始之前完成?