Nyx con Ejemplos

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.

← Anterior Siguiente →

Source: examples/by-example/61-waitgroup.nx