Anuncios

Bienvenidos sean a este post, hoy continuaremos con los threads.

Anuncios

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.

Anuncios

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();
}
Anuncios

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
Anuncios

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);
	});
Anuncios

De la siguiente forma:

	let manejo = thread::spawn(move || {
		println!("Vector: {:?}", v);
	});
Anuncios

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$
Anuncios

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.

Anuncios

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.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50