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.
// 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 }
from main (antes de spawn) from thread thread retorno: 42 7^2 = 49 from main (despues de join)
Cómo funciona
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.