61 / Concurrencia

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.

61-waitgroup.nxFuente →
// 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 ilustrativastdout
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.