WaitGroup
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.
Código
// 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
}
Salida
task C running task C done task A running task A done task B running task B done all tasks completed
Explicación
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 (5ms, 10ms, 20ms). 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.