C++ Academy · Lektion

Asynkrone opgaver og awaiter-typer

Sammensæt asynkrone opgaver med brugerdefinerede awaiter- og promise-typer

Lektion 3 af 414 trin

Asynkrone opgaver og awaiter-typer er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.

Asynkrone korutiner

En asynkron opgave suspenderes under I/O og genoptages, når operationen er færdig. Kombinér co_await med asynkrone API'er for asynkron kode uden callbacks.

Skitse af Task-typen

En Task indkapsler en asynkron korutine. Den understøtter co_await til kædning.

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

Mekanikken bag co_await

Når compileren ser co_await expr, forventer den, at expr er awaitable. Et awaitable har tre metoder:

  • await_ready() — false for at suspendere, true for at springe over
  • await_suspend(handle) — hvad der skal ske under suspensionen
  • await_resume() — værdien, der skal gives til den kaldende kode

Eksempel på awaitable: Sleep

Et awaitable, der planlægger en genoptagelse efter en forsinkelse.

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 til HTTP

Biblioteksleverede awaitables til HTTP-anmodninger, timere og fil-I/O. Sammensæt dem som synkrone kald.

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

Sammensætning af Tasks

Når du afventer én Task inde i en anden, kædes de sammen. Den ydre Task suspenderes, indtil den indre er færdig.

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

Parallelle Tasks

Til parallelt asynkront arbejde skal du starte opgaver uden straks at afvente hver enkelt og derefter afvente dem alle.

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

Videregivelse af undtagelser

Undtagelser, der kastes inde i en asynkron opgave, kan gemmes i promise-objektets unhandled_exception og kastes igen på den side, der afventer opgaven.

Annullering

Standardbiblioteket leverer endnu ikke en primitiv til annullering. Biblioteker (cppcoro, boost.cobalt) bygger deres egne — normalt ved hjælp af annulleringstokens eller stopkilder.

Integration med Boost.Asio

Asio understøtter korutiner direkte. Brug co_await på async_read, async_write og lignende operationer. Det er den reneste C++-løsning til asynkron I/O i dag.

Ydeevne

Genoptagelse af en korutine er langt billigere end trådskift. Compileren inliner ofte dele af tilstandsmaskinen. Profilér for at kontrollere, at din kæde af awaitables kompileres effektivt.

Fremtidige retninger

C++23 tilføjede std::generator og forbedringer. C++26 kan muligvis bringe std::execution (sender/modtager) — et mere generelt asynkront framework, der kan fungere sammen med korutiner.

Hurtigt tjek

Hvilke tre metoder har en awaitable-type brug for?

Opsummering

Asynkrone opgaver kombinerer co_await med awaitables, så du kan skrive asynkron kode uden callbacks. Awaitables har await_ready, await_suspend og await_resume. Biblioteker (cppcoro, Asio) leverer færdige Task- og awaitable-typer.

Gratis at komme i gang

Lær C++ med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Asynkrone opgaver og awaiter-typer” gratis?

Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Asynkrone opgaver og awaiter-typer”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Asynkrone opgaver og awaiter-typer”?

Sammensæt asynkrone opgaver med brugerdefinerede awaiter- og promise-typer Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C++ Academy?

Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Asynkrone opgaver og awaiter-typer”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C++ Academy-lektion?

Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Coroutine-koncepter: co_await, co_yield, co_return
  2. Implementering af en simpel generator
  3. Asynkrone opgaver og awaiter-typer
  4. Allokering af coroutine-rammer
← Tilbage til C++ Academy