Asynkrona uppgifter och awaiter-typer
Sätt samman asynkrona uppgifter med egna awaiter- och promise-typer
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 suspenderingenawait_suspend(handle)— vad som ska göras medan korutinen är suspenderadawait_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.
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
- Coroutine-begrepp: co_await, co_yield, co_return
- Implementera en enkel generator
- Asynkrona uppgifter och awaiter-typer
- Allokering av coroutine-ramar