Asynkrone opgaver og awaiter-typer
Sammensæt asynkrone opgaver med brugerdefinerede awaiter- og promise-typer
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 overawait_suspend(handle)— hvad der skal ske under suspensionenawait_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.
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
- Coroutine-koncepter: co_await, co_yield, co_return
- Implementering af en simpel generator
- Asynkrone opgaver og awaiter-typer
- Allokering af coroutine-rammer