Czy jest jakiś sposób na asynchroniczne oczekiwanie na przyszłość w Boost Asio?
Mój problem jest następujący. Asynchronicznie rozpoczynam kilka operacji i chcę kontynuować, aż wszystkie zostaną zakończone. Używając Boost Asio, najprostszym sposobem na to jest następujące. Przypuszczaćtasks
jest rodzajem kontenera obiektów, które obsługują niektóre operacje asynchroniczne.
tasksToGo = tasks.size();
for (auto task: tasks) {
task.async_do_something([](const boost::system::error_code& ec)
{
if (ec) {
// handle error
} else {
if (--taslsToGo == 0) {
tasksFinished();
}
}
});
}
Problem z tym rozwiązaniem polega na tym, że wydaje się to obejściem. W Boost 1.54 mogę to zrobić za pomocą przyszłości, ale mogę tylko czekać synchronicznie, co jest możliwe tylko z wątku oddzielonego od miejscarun()
jest nazywany.
for (auto task: tasks) {
futures.push_back(task.async_do_something(boost::asio::use_future));
}
for (auto future: futures) {
future.wait();
}
Ten kod jest znacznie jaśniejszy niż poprzedni, ale potrzebuję osobnego wątku, którego nie chcę. Chcę czegoś, co można wykorzystać w ten sposób:
for (auto task: tasks) {
futures.push_back(task.async_do_something(boost::asio::use_future));
}
boost::asio::spawn(ioService, [](boost::asio::yield_context yield)
{
for (auto future: futures) {
future.async_wait(yield);
}
tasksFinished();
}
Czy jest coś, co można wykorzystać w podobny sposób?