Variables de condición y patrones de trabajadores
Coordine hilos con std::condition_variable y el patrón clásico de grupo de trabajadores.
Variables de condición y patrones de trabajadores 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.
Qué es una variable de condición
Una variable de condición permite que un hilo espere hasta que otro hilo indique que una condición ha cambiado. Se usa para coordinar productores y consumidores.
Conceptos básicos de std::condition_variable
Una variable de condición funciona con un std::mutex y un predicado. El hilo que espera libera el bloqueo mientras espera y lo vuelve a adquirir al despertarse.
#include <condition_variable>
#include <mutex>
#include <queue>
std::mutex mtx;
std::condition_variable cv;
std::queue<int> tasks;
bool done = false;Esperar a una condición
Use cv.wait(lock, predicate). Desbloquea atómicamente el mutex y suspende la ejecución hasta recibir una notificación. Al despertarse, vuelve a bloquearlo y comprueba el predicado; si es falso, vuelve a suspenderse.
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return !tasks.empty() || done; });Notificación
El hilo productor llama a cv.notify_one() o cv.notify_all() después de cambiar el estado. El bloqueo debe mantenerse durante el cambio de estado.
{
std::lock_guard<std::mutex> lock(mtx);
tasks.push(42);
}
cv.notify_one();Patrón productor-consumidor
Ejemplo clásico: los productores introducen tareas; los consumidores esperan a que haya tareas.
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return !tasks.empty() || done; });
if (done && tasks.empty()) break;
int task = tasks.front();
tasks.pop();
lock.unlock();
process(task);
}
}Despertares espurios
Un hilo que espera en una variable de condición puede despertarse sin recibir una notificación. Por eso wait recibe un predicado: lo vuelve a comprobar cada vez que el hilo se despierta.
notify_one frente a notify_all
Utilice notify_one cuando un solo hilo en espera pueda avanzar. Utilice notify_all cuando los cambios de estado afecten a todos los hilos en espera (p. ej., una señal de cierre).
Esperas temporizadas
wait_for(lock, duration) y wait_until(lock, time_point) se despiertan al recibir una notificación o después de que se agote el tiempo de espera.
if (cv.wait_for(lock, 1s, [] { return ready; })) {
/* condition met */
} else {
/* timed out */
}Esqueleto de un grupo de trabajadores
Un patrón habitual: un conjunto fijo de hilos de trabajo extrae elementos de una cola compartida. Constrúyalo con mutex + condition_variable + queue + una bandera atómica de detención.
Cómo evitar despertares perdidos
Modifique siempre el estado compartido y llame a notify_* mientras el mutex esté retenido durante el cambio de estado (liberarlo justo antes de llamar a notify es válido, pero asegúrese de mantener el orden). De lo contrario, un hilo en espera podría no recibir la notificación.
std::counting_semaphore (C++20)
Para una señalización sencilla basada en contadores, C++20 añadió std::counting_semaphore, que resulta más simple que las variables de condición para algunos patrones.
Cuidado con los interbloqueos
Mantener varios bloqueos mientras se espera en una variable de condición puede provocar un interbloqueo. Adquiera los bloqueos en un orden coherente y utilice std::scoped_lock para varios mutexes.
Comprobación rápida
¿Por qué cv.wait(lock, predicate) recibe un predicado incluso cuando solo desea esperar una notificación?
Resumen
Una variable de condición coordina los hilos que esperan un cambio de estado. Utilice wait(lock, predicate) para gestionar los despertares espurios, modifique el estado bajo el mutex y llame después a notify_one o notify_all.
Preguntas frecuentes
¿La lección «Variables de condición y patrones de trabajadores» es gratis?
Sí — el texto completo de «Variables de condición y patrones de trabajadores» 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 «Variables de condición y patrones de trabajadores»?
Coordine hilos con std::condition_variable y el patrón clásico de grupo de trabajadores. 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 «Variables de condición y patrones de trabajadores»?
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
- Unión y separación de std::thread
- std::mutex, lock_guard y unique_lock
- Variables de condición y patrones de trabajadores
- Conceptos básicos de std::async y std::future