C++ Academy · Lección

Tareas asíncronas y tipos awaiter

Componga tareas asíncronas con tipos awaiter y promise personalizados.

Lección 3 de 414 pasos

Tareas asíncronas y tipos awaiter es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.

Corrutinas asíncronas

Una tarea asíncrona se suspende durante una operación de E/S y se reanuda cuando esta termina. Combine co_await con API asíncronas para escribir código asíncrono sin callbacks.

Esquema del tipo Task

Una Task encapsula una corrutina asíncrona. Admite co_await para encadenar tareas.

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

Mecánica de co_await

Cuando el compilador encuentra co_await expr, espera que expr sea un awaitable. Un awaitable tiene tres métodos:

  • await_ready() — false para suspender o true para omitir la suspensión
  • await_suspend(handle) — qué hacer mientras la ejecución está suspendida
  • await_resume() — valor que se entrega al código que realizó la llamada

Ejemplo de awaitable: Sleep

Un awaitable que programa una reanudación después de un retraso.

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

Awaitables proporcionados por bibliotecas para solicitudes HTTP, temporizadores y E/S de archivos. Compóngalos como si fueran llamadas síncronas.

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

Composición de tareas

Esperar una tarea dentro de otra las encadena. La tarea externa se suspende hasta que termina la interna.

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

Tareas paralelas

Para realizar trabajo asíncrono en paralelo, inicie las tareas sin esperar inmediatamente a cada una y, después, espérelas todas.

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

Propagación de excepciones

Las excepciones producidas dentro de una tarea asíncrona se pueden capturar en unhandled_exception del promise y volver a producir en el lado del awaiter.

Cancelación

La biblioteca estándar todavía no proporciona una primitiva de cancelación. Las bibliotecas (cppcoro, boost.cobalt) crean las suyas, normalmente mediante tokens de cancelación o fuentes de parada.

Integración con Boost.Asio

Asio admite corrutinas de forma nativa. Utilice co_await con async_read, async_write y operaciones similares. Es la forma más limpia de realizar E/S asíncrona en C++ actualmente.

Rendimiento

Reanudar una corrutina es mucho más económico que cambiar de subproceso. El compilador suele insertar partes de la máquina de estados. Perfile el código para verificar que la cadena de awaitables se compila correctamente.

Direcciones futuras

C++23 añadió std::generator y otras mejoras. C++26 podría incorporar std::execution (sender/receiver), un marco asíncrono más general que interoperaría con las corrutinas.

Comprobación rápida

¿Qué tres métodos necesita un tipo awaitable?

Resumen

Las tareas asíncronas combinan co_await con awaitables para escribir código asíncrono sin callbacks. Los awaitables tienen await_ready, await_suspend y await_resume. Las bibliotecas (cppcoro, Asio) proporcionan tipos de tareas y awaitables listos para usar.

Gratis para empezar

Aprende C++ con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
51
Lecciones
203

Preguntas frecuentes

¿La lección «Tareas asíncronas y tipos awaiter» es gratis?

Sí — el texto completo de «Tareas asíncronas y tipos awaiter» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Tareas asíncronas y tipos awaiter»?

Componga tareas asíncronas con tipos awaiter y promise personalizados. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C++ Academy?

No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Tareas asíncronas y tipos awaiter»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C++ Academy?

Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Conceptos de coroutines: co_await, co_yield y co_return
  2. Implementación de un generador sencillo
  3. Tareas asíncronas y tipos awaiter
  4. Asignación del marco de una coroutine
← Volver a C++ Academy