Attività asincrone e tipi awaiter
Componi attività asincrone con tipi awaiter e promise personalizzati
Attività asincrone e tipi awaiter è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.
Coroutine asincrone
Un task asincrono si sospende durante l'I/O e riprende quando l'operazione è completata. Combini co_await con le API asincrone per scrivere codice asincrono senza callback.
Schema del tipo Task
Un Task racchiude una coroutine asincrona. Supporta co_await per concatenare le operazioni.
template <typename T>
struct Task {
struct promise_type;
std::coroutine_handle<promise_type> handle;
// ...
};Meccanismo di co_await
Quando il compilatore incontra co_await expr, si aspetta che expr sia un awaitable. Un awaitable ha tre metodi:
await_ready()— false per sospendere, true per saltare la sospensioneawait_suspend(handle)— definisce che cosa fare durante la sospensioneawait_resume()— il valore da restituire al codice chiamante
Esempio di awaitable: Sleep
Un awaitable che pianifica la ripresa dopo un intervallo.
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 per HTTP
Awaitable forniti dalla libreria per richieste HTTP, timer e I/O su file. Li componga come chiamate sincrone.
Task<std::string> fetch() {
auto data = co_await http_get("/api/data");
co_return data;
}Comporre i task
Attendere un task all'interno di un altro li concatena. Il task esterno si sospende finché quello interno non termina.
Task<int> outer() {
int x = co_await inner_a();
int y = co_await inner_b();
co_return x + y;
}Task paralleli
Per il lavoro asincrono parallelo, avvii i task senza attenderli immediatamente uno alla volta, quindi li attenda tutti.
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;
}Propagazione delle eccezioni
Le eccezioni lanciate all'interno di un task asincrono possono essere catturate in unhandled_exception del promise e rilanciate dal lato dell'attender.
Cancellazione
La libreria standard non fornisce ancora una primitiva di cancellazione. Le librerie, come cppcoro e boost.cobalt, ne implementano di proprie, in genere tramite token di cancellazione o sorgenti di stop.
Integrazione con Boost.Asio
Asio supporta nativamente le coroutine. Può usare co_await con async_read, async_write e operazioni simili. È oggi la soluzione più pulita per l'I/O asincrono in C++.
Prestazioni
La ripresa di una coroutine è molto più economica del cambio di thread. Il compilatore spesso effettua l'inlining di parti della macchina a stati. Esegua il profiling per verificare che la catena di awaitable venga compilata in modo efficiente.
Sviluppi futuri
C++23 ha aggiunto std::generator e altri miglioramenti. C++26 potrebbe introdurre std::execution, basato su sender/receiver: un framework asincrono più generale che interopera con le coroutine.
Verifica rapida
Quali tre metodi deve avere un tipo awaitable?
Riepilogo
I task asincroni combinano co_await con gli awaitable per scrivere codice asincrono senza callback. Gli awaitable hanno await_ready, await_suspend e await_resume. Le librerie, come cppcoro e Asio, forniscono tipi pronti all'uso per task e awaitable.
Domande Frequenti
La lezione «Attività asincrone e tipi awaiter» è gratuita?
Sì — il testo completo di «Attività asincrone e tipi awaiter» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.
Cosa imparerò in «Attività asincrone e tipi awaiter»?
Componi attività asincrone con tipi awaiter e promise personalizzati Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C++ Academy?
Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Attività asincrone e tipi awaiter»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C++ Academy?
Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Concetti delle coroutine: co_await, co_yield, co_return
- Implementare un semplice generatore
- Attività asincrone e tipi awaiter
- Allocazione del frame delle coroutine