println!("Hola, desde {}", i), Err(_) => println!("Error"), } } println!("Llegue al final exitosamente!"); }"> println!("Hola, desde {}", i), Err(_) => println!("Error"), } } println!("Llegue al final exitosamente!"); }"> println!("Hola, desde {}", i), Err(_) => println!("Error"), } } println!("Llegue al final exitosamente!"); }">
use std::thread::spawn;
fn main() {
let mut thread_handlers = vec![];
for i in 0..10{
thread_handlers.push(spawn(move || {
println!("Hello from thread {}", i);
i
}
));
}
for thread_handler in thread_handlers{
match thread_handler.join() {
Ok(i) => println!("Hola, desde {}", i),
Err(_) => println!("Error"),
}
}
println!("Llegue al final exitosamente!");
}
thread_handler.join() devuelve Result(T,E) por lo tanto siempre debo extraerlo.
La razon por la que devuelve Result es para que sea thread safe. Si un thread falla (panic) entonces no hace que el padre falle (panic), simplemente devuelve Error y el padre se encarga.
Dentro del Result(T,E)en T podemos ver el valor que devuelve el thread. Puede ser cualquier cosa, inclusive otro Result(T,E)
Debemos guardar los handlers en thread_handlers para poder esperarlos. Esto es para que sea correcto ya que una vez que el thread padre termina entonces dropea todas sus refrencias, incluyendo las referencias a los thread hijos.
De esta forma aseguramos que todos los threads terminan antes de seguir con el thread padre