Óxido - Concurrencia

En la programación concurrente, las diferentes partes de un programa se ejecutan de forma independiente. Por otro lado, en la programación paralela, diferentes partes de un programa se ejecutan al mismo tiempo. Ambos modelos son igualmente importantes ya que más computadoras aprovechan sus múltiples procesadores.

Hilos

Podemos usar hilos para ejecutar códigos simultáneamente. En los sistemas operativos actuales, el código de un programa ejecutado se ejecuta en un proceso y el sistema operativo administra varios procesos a la vez. Dentro de su programa, también puede tener partes independientes que se ejecuten simultáneamente. Las funciones que ejecutan estas partes independientes se denominan subprocesos.

Creando un hilo

los thread::spawnLa función se usa para crear un nuevo hilo. La función de generación toma un cierre como parámetro. El cierre define el código que debe ejecutar el hilo. El siguiente ejemplo imprime texto de un hilo principal y otro texto de un hilo nuevo.

//import the necessary modules
use std::thread;
use std::time::Duration;

fn main() {
   //create a new thread
   thread::spawn(|| {
      for i in 1..10 {
         println!("hi number {} from the spawned thread!", i);
         thread::sleep(Duration::from_millis(1));
      }
   });
   //code executed by the main thread
   for i in 1..5 {
      println!("hi number {} from the main thread!", i);
      thread::sleep(Duration::from_millis(1));
   }
}

Salida

hi number 1 from the main thread!
hi number 1 from the spawned thread!
hi number 2 from the main thread!
hi number 2 from the spawned thread!
hi number 3 from the main thread!
hi number 3 from the spawned thread!
hi number 4 from the spawned thread!
hi number 4 from the main thread!

El hilo principal imprime valores de 1 a 4.

NOTE- El nuevo hilo se detendrá cuando finalice el hilo principal. La salida de este programa puede ser un poco diferente cada vez.

los thread::sleepLa función obliga a un subproceso a detener su ejecución durante un período breve, lo que permite que se ejecute un subproceso diferente. Los hilos probablemente se turnarán, pero eso no está garantizado, depende de cómo el sistema operativo programe los hilos. En esta ejecución, el hilo principal se imprime primero, aunque la declaración de impresión del hilo generado aparece primero en el código. Además, incluso si el hilo generado está programado para imprimir valores hasta 9, solo llegó a 5 antes de que el hilo principal se apague.

Unir manijas

Es posible que un hilo generado no tenga la oportunidad de ejecutarse o ejecutarse completamente. Esto se debe a que el hilo principal se completa rápidamente. La función spawn <F, T> (f: F) -> JoinHandlelt; T> devuelve un JoinHandle. El método join () en JoinHandle espera a que finalice el hilo asociado.

use std::thread;
use std::time::Duration;

fn main() {
   let handle = thread::spawn(|| {
      for i in 1..10 {
         println!("hi number {} from the spawned thread!", i);
         thread::sleep(Duration::from_millis(1));
      }
   });
   for i in 1..5 {
      println!("hi number {} from the main thread!", i);
      thread::sleep(Duration::from_millis(1));
   }
   handle.join().unwrap();
}

Salida

hi number 1 from the main thread!
hi number 1 from the spawned thread!
hi number 2 from the spawned thread!
hi number 2 from the main thread!
hi number 3 from the spawned thread!
hi number 3 from the main thread!
hi number 4 from the main thread!
hi number 4 from the spawned thread!
hi number 5 from the spawned thread!
hi number 6 from the spawned thread!
hi number 7 from the spawned thread!
hi number 8 from the spawned thread!
hi number 9 from the spawned thread!

El hilo principal y el hilo generado continúan cambiando.

NOTE - El hilo principal espera a que se complete el hilo generado debido a la llamada al join() método.