WaitGroup de std/sync coordina múltiples hilos. wg_add establece el contador esperado, cada hilo llama a wg_done al terminar, y wg_wait bloquea hasta que el contador llega a cero.
// WaitGroup — waiting for multiple threads to finish // WaitGroup — esperar a que múltiples hilos terminen import "std/sync" var wg: WaitGroup = wg_new() fn task_a() -> int { print("task A running") sleep(10) print("task A done") wg_done(wg) return 0 } fn task_b() -> int { print("task B running") sleep(20) print("task B done") wg_done(wg) return 0 } fn task_c() -> int { print("task C running") sleep(5) print("task C done") wg_done(wg) return 0 } fn main() -> int { // Set the counter to the number of tasks wg_add(wg, 3) // Spawn three concurrent tasks thread_spawn(task_a) thread_spawn(task_b) thread_spawn(task_c) // Block until all three call wg_done() wg_wait(wg) print("all tasks completed") return 0 }
task C running task C done task A running task A done task B running task B done all tasks completed
Cómo funciona
WaitGroup se importa de std/sync. Mantiene un contador interno: wg_add(wg, 3) lo establece en 3, cada llamada a wg_done lo decrementa en 1, y wg_wait bloquea hasta que el contador llega a cero.
Tres tareas se ejecutan de forma concurrente con distintas duraciones de espera (5, 10 y 20 milisegundos). La tarea C termina primero porque duerme menos tiempo. El orden exacto de la salida depende de la planificación de hilos, pero "all tasks completed" siempre se imprime al final porque wg_wait garantiza que todos los hilos ya llamaron a wg_done.
Este patrón es ideal cuando se necesita repartir trabajo entre múltiples hilos y esperar a que todos terminen antes de continuar. A diferencia de thread_join, no es necesario rastrear los handles de cada hilo individualmente.