Rost - Parallelität

Bei der gleichzeitigen Programmierung werden verschiedene Teile eines Programms unabhängig voneinander ausgeführt. Andererseits werden bei der parallelen Programmierung verschiedene Teile eines Programms gleichzeitig ausgeführt. Beide Modelle sind gleich wichtig, da mehr Computer ihre mehreren Prozessoren nutzen.

Themen

Wir können Threads verwenden, um Codes gleichzeitig auszuführen. In aktuellen Betriebssystemen wird der Code eines ausgeführten Programms in einem Prozess ausgeführt, und das Betriebssystem verwaltet mehrere Prozesse gleichzeitig. Innerhalb Ihres Programms können Sie auch unabhängige Teile haben, die gleichzeitig ausgeführt werden. Die Funktionen, mit denen diese unabhängigen Teile ausgeführt werden, werden als Threads bezeichnet.

Thread erstellen

Das thread::spawnFunktion wird verwendet, um einen neuen Thread zu erstellen. Die Spawn-Funktion nimmt einen Abschluss als Parameter. Der Abschluss definiert Code, der vom Thread ausgeführt werden soll. Im folgenden Beispiel wird Text aus einem Hauptthread und anderer Text aus einem neuen Thread gedruckt.

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

Ausgabe

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!

Der Haupt-Thread druckt Werte von 1 bis 4.

NOTE- Der neue Thread wird gestoppt, wenn der Haupt-Thread endet. Die Ausgabe dieses Programms kann jedes Mal etwas anders sein.

Das thread::sleepDie Funktion zwingt einen Thread, seine Ausführung für kurze Zeit zu stoppen, sodass ein anderer Thread ausgeführt werden kann. Die Threads werden sich wahrscheinlich abwechseln, aber das ist nicht garantiert - es hängt davon ab, wie das Betriebssystem die Threads plant. In diesem Lauf wird der Hauptthread zuerst gedruckt, obwohl die Druckanweisung des erzeugten Threads zuerst im Code angezeigt wird. Selbst wenn der erzeugte Thread so programmiert ist, dass er Werte bis 9 druckt, wurde er erst vor dem Herunterfahren des Hauptthreads auf 5 gesetzt.

Griffe verbinden

Ein gespawnter Thread hat möglicherweise keine Chance, vollständig oder vollständig ausgeführt zu werden. Dies liegt daran, dass der Haupt-Thread schnell abgeschlossen wird. Die Funktion spawn <F, T> (f: F) -> JoinHandlelt; T> gibt ein JoinHandle zurück. Die join () -Methode in JoinHandle wartet auf den Abschluss des zugeordneten Threads.

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

Ausgabe

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!

Der Haupt-Thread und der erzeugte Thread wechseln weiter.

NOTE - Der Hauptthread wartet auf den Abschluss des gespawnten Threads aufgrund des Aufrufs von join() Methode.