Tôi đang bắt đầu một số coroutines với asio :: đẻ trứng, và tôi muốn đợi cho đến khi tất cả sau đó được hoàn thành và làm một số công việc khác sau đó. Làm thế nào nó có thể được thực hiện?Làm thế nào để chờ đợi để hoàn thành tất cả các tăng: asio của coroutines stackful?
Các dòng điều khiển được như sau:
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();
CẬP NHẬT
Dưới đây là các mẫu mã
#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();
}
Và kết quả là:
// 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
Trong khi tôi đang mong đợi:
// 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
(thấy nơi "kết thúc Coro chính" line)
IIRC 'io.run();' chỉ thực hiện những gì bạn muốn ... – vines
@vines - không, không phải vậy. [Mã Coliru] (http://coliru.stacked-crooked.com/a/e67cceb688156974) –