Gibt es eine Möglichkeit, asynchron zu warten, für eine Zukunft in der Boost Asio?

Mein problem ist Folgendes. Ich starte mehrere Operationen asynchron, und ich will fortfahren, bis alle fertig sind. Mit Boost Asio, der einfachste Weg, dies zu tun, ist die folgende. Angenommen tasks ist eine Art von container von Objekten, die Unterstützung asynchroner Vorgang.

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 fühlt sich an wie ein workaround. Im Boost 1.54 ich kann es mit futures, aber ich kann nur warten, synchron, und das ist nur möglich von einem separaten thread aus, wo run() genannt wird.

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 das Vorherige, aber ich brauche einen eigenen thread, die ich nicht will. Ich möchte etwas, das kann z.B. so verwendet werden:

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 verwendet werden kann, ähnlich?

  • Nicht future.then() was du suchst ?
InformationsquelleAutor petersohn | 2013-08-13
Schreibe einen Kommentar