Tareas asíncronas y tipos awaiter
Componga tareas asíncronas con tipos awaiter y promise personalizados.
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ónawait_suspend(handle)— qué hacer mientras la ejecución está suspendidaawait_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.
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
- Conceptos de coroutines: co_await, co_yield y co_return
- Implementación de un generador sencillo
- Tareas asíncronas y tipos awaiter
- Asignación del marco de una coroutine