Bienvenidos sean a este post, hoy continuaremos con los threads.
Cuando vimos en este post como crear un thread mediante spawn dijimos que se deberia hacer a traves de un closure, del cual hablamos en este post, pero hoy hablaremos sobre un metodo que nos permite mover un closure de un thread a otro, para entenderlo mejor vamos a crear un ejemplo.
Para ello crearemos un nuevo proyecto que llamaremos mover, una vez creado modificaremos el codigo generado del archivo main.rs por el siguiente:
main.rs
use std::thread;
fn main()
{
let v = vec![1, 2, 3];
let manejo = thread::spawn(|| {
println!("Vector: {:?}", v);
});
manejo.join().unwrap();
}
En este codigo crearemos primero un vector, luego aplicaremos un spawn para mostrar al vector antes creado y lo almacenaremos en una variable para finalmente usar un join y que se ejecute el thread anterior, tal como vimos en el post anterior, compilemos y veamos su salida:
tinchicus@dbn001vrt:~/lenguajes/rust/mover$ cargo run
Compiling mover v0.1.0 (/home/tinchicus/lenguajes/rust/mover)
error[E0373]: closure may outlive the current function, but it borrows `v`, which is owned by the current function
No funciono, esto es debido a que al momento de intentar ejecutar el codigo en este thread ya no se encuentra activo por lo tanto el compilador al no tener garantias sobre este procede a no compilarlo, aunque esto tiene solucion, para ello debemos modificar el siguiente bloque:
let manejo = thread::spawn(|| {
println!("Vector: {:?}", v);
});
De la siguiente forma:
let manejo = thread::spawn(move || {
println!("Vector: {:?}", v);
});
Observen que el unico cambio que agregamos fue simplemente la palabra move antes de todo el closure para que justamente nos permite mover todo lo que se hace en la funcion del closure al thread principal, si lo compilamos nuevamente sucedera lo siguiente:
tinchicus@dbn001vrt:~/lenguajes/rust/mover$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.02s
Running `target/debug/mover`
Vector: [1, 2, 3]
tinchicus@dbn001vrt:~/lenguajes/rust/mover$
Como pueden ver ahora funciono correctamente porque al realizar el movimiento del closure al thread principal, el compilador sabe perfectamente como actuara al momento de la ejecucion y permitiendo que se pueda compilar, este es basicamente su uso para permitir un mejor pase de informacion de un thread a otro, usualmente el principal.
En resumen, hoy hemos visto al move de closure, que es, para que sirve, como interactua con los threads y como nos puede ayudar con algunas eventualidades a la hora de manejar informacion entre threads como vimos en el ejemplo, espero te haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
