C++ Academy · Lektion

Asynkrona uppgifter och awaiter-typer

Sätt samman asynkrona uppgifter med egna awaiter- och promise-typer

Lektion 3 av 414 steg

Asynkrona uppgifter och awaiter-typer är en gratis lektion i C++ Academy på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för C++ Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C++ Academy innehåller totalt 4 lektioner.

Asynkrona korutiner

En asynkron uppgift suspenderas vid I/O och återupptas när operationen är klar. Kombinera co_await med asynkrona API:er för asynkron kod utan callbacks.

Skiss över Task-typen

En Task kapslar in en asynkron korutin. Den stöder co_await för kedjning.

template <typename T>
struct Task {
    struct promise_type;
    std::coroutine_handle<promise_type> handle;
    // ...
};

Så fungerar co_await

När kompilatorn ser co_await expr förväntar den sig att expr är en awaitable. En awaitable har tre metoder:

  • await_ready() — false för att suspendera, true för att hoppa över suspenderingen
  • await_suspend(handle) — vad som ska göras medan korutinen är suspenderad
  • await_resume() — värdet som ska lämnas till den anropande koden

Awaitable-exempel: Sleep

En awaitable som schemalägger en återupptagning efter en fördröjning.

struct Sleep {
    std::chrono::milliseconds duration;
    bool await_ready() const { return false; }
    void await_suspend(std::coroutine_handle<> h) {
        std::thread([h, this] {
            std::this_thread::sleep_for(duration);
            h.resume();
        }).detach();
    }
    void await_resume() {}
};

Task<void> example() {
    co_await Sleep{500ms};
    std::cout << "after 500ms";
}

Awaitable för HTTP

Bibliotekstillhandahållna awaitables för HTTP-begäranden, timers och fil-I/O. Kombinera dem som synkrona anrop.

Task<std::string> fetch() {
    auto data = co_await http_get("/api/data");
    co_return data;
}

Kedja uppgifter

När en uppgift inväntas inuti en annan kedjas de samman. Den yttre uppgiften suspenderas tills den inre är klar.

Task<int> outer() {
    int x = co_await inner_a();
    int y = co_await inner_b();
    co_return x + y;
}

Parallella uppgifter

För parallellt asynkront arbete startar ni uppgifter utan att invänta var och en direkt och inväntar sedan alla.

Task<int> sum_tasks() {
    auto a = inner_a();
    auto b = inner_b();
    int x = co_await a;
    int y = co_await b;
    co_return x + y;
}

Undantagspropagering

Undantag som kastas inuti en asynkron uppgift kan fångas i promise-objektets unhandled_exception och kastas om på awaiter-sidan.

Avbrytning

Standardbiblioteket tillhandahåller ännu ingen primitiv för avbrytning. Bibliotek (cppcoro, boost.cobalt) bygger sina egna — vanligtvis via cancellation tokens eller stop sources.

Boost.Asio-integration

Asio stöder korutiner inbyggt. Använd co_await på async_read, async_write och liknande operationer. Det är det renaste sättet att skriva asynkront I/O i C++ i dag.

Prestanda

Att återuppta en korutin är mycket billigare än att byta tråd. Kompilatorn inline:ar ofta delar av tillståndsmaskinen. Profilera för att verifiera att kedjan av awaitables kompileras effektivt.

Framtida riktningar

C++23 lade till std::generator och andra förbättringar. C++26 kan komma att ge std::execution (sender/receiver) — ett mer generellt asynkront ramverk som samverkar med korutiner.

Snabb kontroll

Vilka tre metoder behöver en awaitable-typ?

Sammanfattning

Asynkrona uppgifter kombinerar co_await med awaitables för att skriva asynkron kod utan callbacks. Awaitables har await_ready, await_suspend och await_resume. Bibliotek (cppcoro, Asio) tillhandahåller färdiga uppgifts- och awaitable-typer.

Gratis att börja

Lär dig C++ med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
51
Lektioner
203

Vanliga frågor

Är lektionen ”Asynkrona uppgifter och awaiter-typer” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen C++ Academy, inklusive ”Asynkrona uppgifter och awaiter-typer”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i C++ Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Asynkrona uppgifter och awaiter-typer”?

Sätt samman asynkrona uppgifter med egna awaiter- och promise-typer Ni övar på C++ Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C++ Academy?

Du behöver inga förkunskaper. Utbildningen i C++ Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Asynkrona uppgifter och awaiter-typer”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C++ Academy-lektionen?

Ja. Varje C++ Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Coroutine-begrepp: co_await, co_yield, co_return
  2. Implementera en enkel generator
  3. Asynkrona uppgifter och awaiter-typer
  4. Allokering av coroutine-ramar
← Tillbaka till C++ Academy