Nyx con Ejemplos

Creación de Threads

thread_spawn(fn) inicia un nuevo hilo del sistema operativo que ejecuta la función dada de forma concurrente. thread_join(handle) bloquea el hilo que llama hasta que el hilo creado termina, y retorna su resultado entero. Este es el primitivo fundamental de concurrencia en Nyx.

Código

// Threads: thread_spawn() para crear un hilo, thread_join() para esperar

fn tarea_hilo() -> int {
    print("from thread")
    return 42
}

fn calcular_cuadrado() -> int {
    let n: int = 7
    return n * n
}

fn main() -> int {
    print("from main (antes de spawn)")

    // Crear un thread y esperar su resultado
    let handle: int = thread_spawn(tarea_hilo)
    let resultado: int = thread_join(handle)
    print("thread retorno: " + int_to_string(resultado))

    // Segundo thread con cálculo
    let h2: int = thread_spawn(calcular_cuadrado)
    let r2: int = thread_join(h2)
    print("7^2 = " + int_to_string(r2))

    print("from main (despues de join)")

    return 0
}

Salida

from main (antes de spawn)
from thread
thread retorno: 42
7^2 = 49
from main (despues de join)

Explicación

thread_spawn acepta una referencia a función (no una closure con capturas) y retorna un handle entero opaco que representa el hilo en ejecución. La función creada debe tener la firma () -> int. La ejecución de main y del hilo creado procede en paralelo — en este ejemplo el hilo imprime antes de que thread_join retorne, pero el orden exacto de intercalado depende del sistema operativo.

thread_join(handle) espera a que el hilo termine y recupera su valor de retorno como int. Este es el patrón estándar fork-join: crear trabajo, hacer otras cosas (o crear más hilos), y luego recolectar los resultados. El valor de retorno de tarea_hilo es 42, y calcular_cuadrado retorna 7 * 7 = 49.

Los threads en Nyx corren sobre el pool de threads del sistema operativo y están integrados con el recolector de basura Boehm (GC_THREADS está habilitado en el runtime). Para patrones de concurrencia de más alto nivel, ver los primitivos de goroutines spawn/select y el planificador work-stealing M:N en recetas posteriores.

← Anterior Siguiente →

Source: examples/by-example/40-thread-spawn.nx