【发布时间】:2014-12-16 12:05:28
【问题描述】:
我正在使用 asio::spawn 启动一些协程,我想等到所有这些都完成后再做一些其他工作。怎么做?
控制流程如下:
asio::spawn (io, [] (asio::yield_context yield) {
...
// starting few coroutines
asio::spawn (yield, [] (asio::yield_context yield2) { ... });
asio::spawn (yield, [] (asio::yield_context yield2) { ... });
asio::spawn (yield, [] (asio::yield_context yield2) { ... });
asio::spawn (yield, [] (asio::yield_context yield2) { ... });
// now I want to wait for all of them to finish before I do
// some other work?
...
});
io.run ();
更新
下面是示例代码
#include <boost/asio.hpp>
#include <boost/asio/spawn.hpp>
#include <boost/asio/steady_timer.hpp>
#include <chrono>
#include <iostream>
using namespace std;
int main ()
{
using namespace boost::asio;
io_service io;
spawn (io, [&] (yield_context yield) {
cout << "main coro starts\n";
auto lambda = [&] (yield_context yield)
{
cout << "in lambda inside subcoroutine - starts\n";
steady_timer t (io, std::chrono::seconds (1));
t.async_wait (yield);
cout << "in lambda inside subcoroutine - finishes\n";
};
// starting few coroutines
spawn (yield, lambda);
spawn (yield, lambda);
// now I want to wait for all of them to finish before I do
// some other work?
// ???
cout << "main coro finishes\n";
});
io.run ();
}
输出是:
// main coro starts
// in lambda inside subcoroutine - starts
// in lambda inside subcoroutine - starts
// main coro finishes <----
// in lambda inside subcoroutine - finishes
// in lambda inside subcoroutine - finishes
虽然我期待:
// main coro starts
// in lambda inside subcoroutine - starts
// in lambda inside subcoroutine - starts
// in lambda inside subcoroutine - finishes
// in lambda inside subcoroutine - finishes
// main coro finishes
(见“主coro完成”行的地方)
【问题讨论】:
-
IIRC
io.run ();只是做你想做的事...... -
@vines - 不,不是。 Coliru Code
标签: c++ boost boost-asio coroutine