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?

questionAnswers(2)

yourAnswerToTheQuestion