capypad
0 Tage Serie
rust / intermediate
Snippet

Thread-basierte Nebenliufigkeit mit std::thread und Channels

Rust's std::thread Modul ermöglicht die Erstellung nativer OS-Threads, und mpsc (Multi-Producer, Single-Consumer) Channels ermöglichen sichere Kommunikation zwischen Threads. Der Channel besteht aus einem Sender (tx) und Empfanger (rx). Die spawn-Funktion erstellt einen neuen Thread, und move erlaubt der Closure Besitz von erfassten Variablen zu übernehmen (tx in diesem Fall). Nachrichten, die durch den Channel gesendet werden, sind garantiert ohne Data Races zugestellt. Der Empfanger-Iterator blockiert bis Nachrichten verfugbar sind, was ihn ideal fur die Koordination zwischen Threads macht.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use std::thread;
use std::sync::mpsc;
use std::time::Duration;
 
fn main() {
let (tx, rx) = mpsc::channel();
 
let handle = thread::spawn(move || {
for i in 1..=5 {
println!("Thread: sending {}", i);
tx.send(i).unwrap();
thread::sleep(Duration::from_millis(100));
}
});
 
for received in rx.iter().take(5) {
println!("Main: received {}", received);
}
 
handle.join().unwrap();
println!("Thread completed successfully");
}
Erklärung
1
use std::thread;
Importiere thread Modul zum Erstellen nativer OS-Threads
2
use std::sync::mpsc;
Importiere mpsc (Multi-Producer Single-Consumer) Channel-Primitive
3
let (tx, rx) = mpsc::channel();
Erstelle Channel-Paar: Sender- und Empfanger-Endpunkte
4
let handle = thread::spawn(move || {
Erstelle neuen Thread, move übertragt tx-Besitz in die Closure
5
for i in 1..=5 {
Schleife 5 Mal mit inkrementierenden Integern
6
tx.send(i).unwrap();
Sende Wert durch Channel, unwrap behandelt Send-Fehler
7
thread::sleep(Duration::from_millis(100));
Simuliere Arbeit mit 100ms Pause zwischen Sendevorgangen
8
for received in rx.iter().take(5) {
Iteriere uber Channel mit take(5) um genau 5 Nachrichten zu verarbeiten
9
println!("Main: received {}", received);
Drucke jeden empfangenen Wert im Haupt-Thread
10
handle.join().unwrap();
Warte auf beendeten Thread, unwrap Join-Ergebnis
11
println!("Thread completed successfully");
Bestatigungsnachricht nach Thread-Beendigung