capypad
0 Tage Serie
rust / intermediate
Snippet

Thread-sicherer gemeinsamer Zustand mit Arc<Mutex<T>>

Arc<T> (Atomare Referenzzählung) ermöglicht mehrere Eigentümer über Threads hinweg. Mutex<T> bietet gegenseitigen Ausschluss, um Datenrennen zu verhindern, wenn mehrere Threads dieselben Daten mutieren müssen. Die lock()-Methode blockiert, bis die Sperre erworben wird, und gibt einen MutexGuard<T> zurück, der beim Drop automatisch freigegeben wird. Diese Kombination ist Rusts Hauptmechanismus für sicheren gemeinsamen veränderlichen Zustand in nebenläufigen Programmen.

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::sync::{Arc, Mutex};
use std::thread;
 
fn main() {
let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];
 
for _ in 0..10 {
let counter = Arc::clone(&counter);
let handle = thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
 
for handle in handles {
handle.join().unwrap();
}
 
println!("Result: {}", *counter.lock().unwrap());
}
Erklärung
1
Arc::new(Mutex::new(0))
Erstellt gemeinsames Eigentum mit atomarer Referenzzählung und gegenseitigem Ausschluss
2
Arc::clone(&counter)
Klonen für jeden Thread - günstige Referenzzählungsinkrementierung, keine tiefe Kopie
3
let mut num = counter.lock().unwrap();
Sperre erwerben; unwrap paniced bei Vergiftung; num ist MutexGuard<i32>
4
*num += 1;
Ändern durch den Wächter; Sperre automatisch freigegeben wenn num den Scope verlässt