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