Los canales son el mecanismo principal de paso de mensajes en Nyx. channel_new(capacity) crea un canal con buffer, channel_send envía un valor, y channel_recv bloquea hasta que un valor esté disponible. Los canales se declaran con el tipo Map.
// Channels — typed message passing between threads // Canales — paso de mensajes tipado entre hilos var ch: Map = Map.new() fn producer() -> int { var i: int = 0 while i < 5 { channel_send(ch, i) i = i + 1 } // Send sentinel to signal done channel_send(ch, -1) return 0 } fn main() -> int { // Create a buffered channel (capacity 10) ch = channel_new(10) // Spawn producer thread let h: int = thread_spawn(producer) // Receive messages until sentinel var running: bool = true while running { let val: int = channel_recv(ch) if val == -1 { running = false } else { print("received: " + int_to_string(val)) } } thread_join(h) channel_destroy(ch) print("done") return 0 }
received: 0 received: 1 received: 2 received: 3 received: 4 done
Cómo funciona
Los canales en Nyx usan el tipo Map como tipo de declaración -- este es un detalle clave a recordar. channel_new(10) crea un canal con buffer que puede contener hasta 10 valores antes de que un emisor se bloquee.
El productor envía los enteros del 0 al 4, y luego envía -1 como valor centinela para señalar la finalización. El hilo principal recorre llamando a channel_recv, que bloquea hasta que hay datos disponibles, y se detiene cuando recibe el centinela.
Siempre llama a channel_destroy después de que tanto el emisor como el receptor terminaron, para liberar los recursos subyacentes. La llamada a thread_join asegura que el productor haya terminado antes de la limpieza.