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.