Gibt es eine Möglichkeit, in Boost Asio asynchron auf eine Zukunft zu warten?

Mein Problem ist folgendes. Ich starte mehrere Vorgänge asynchron und möchte fortfahren, bis alle abgeschlossen sind. Mit Boost Asio ist dies am einfachsten wie folgt. Annehmentasks ist eine Art Container mit Objekten, die eine asynchrone Operation unterstützen.

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();
            }
        }
    });
}

Das Problem mit dieser Lösung ist, dass es sich wie eine Problemumgehung anfühlt. In Boost 1.54 kann ich es mit Futures machen, aber ich kann nur synchron warten, was nur von einem Thread möglich ist, der von wo getrennt istrun() wird genannt.

for (auto task: tasks) {
    futures.push_back(task.async_do_something(boost::asio::use_future));
}

for (auto future: futures) {
    future.wait();
}

Dieser Code ist viel klarer als der vorherige, aber ich benötige einen separaten Thread, den ich nicht möchte. Ich möchte etwas, das so verwendet werden kann:

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();

}

Gibt es etwas, das ähnlich verwendet werden kann?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage