0Pricing
C++ Academy · Lezione

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 sospensione
  • await_suspend(handle) — definisce che cosa fare durante la sospensione
  • await_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

  1. Concetti delle coroutine: co_await, co_yield, co_return
  2. Implementare un semplice generatore
  3. Attività asincrone e tipi awaiter
  4. Allocazione del frame delle coroutine
← Torna a C++ Academy