Моя проблема в следующем. Я запускаю несколько операций асинхронно, и я хочу продолжить, пока все они не будут завершены. Используя Boost Asio, наиболее простой способ сделать это следующий. Предположим, что tasks
- это какой-то контейнер объектов, которые поддерживают некоторую асинхронную операцию.
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();
}
}
});
}
Проблема с этим решением заключается в том, что он похож на обходной путь. В Boost 1.54 я могу сделать это с помощью фьючерсов, но я могу только ждать синхронно, что возможно только из потока, отдельно от которого вызывается run()
.
for (auto task: tasks) {
futures.push_back(task.async_do_something(boost::asio::use_future));
}
for (auto future: futures) {
future.wait();
}
Этот код намного ясен, чем предыдущий, но мне нужен отдельный поток, который я не хочу. Я хочу что-то, что можно использовать следующим образом:
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();
}
Есть ли что-нибудь, что можно использовать аналогично?