rust / intermediate
Snippet
Send und Sync Traits für Threadsicherheit
Send und Sync sind Marker-Traits, die Threadsicherheitseigenschaften anzeigen. Typen, die Send implementieren, können zwischen Threads transferiert werden. Typen, die Sync implementieren, können gleichzeitig von mehreren Threads zugegriffen werden (&T ist Send). RefCell ist Send aber NICHT Sync—es erzwingt Borrow-Checking zur Laufzeit.
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::thread;use std::sync::Arc;use std::cell::RefCell;fn main() {let shared_data = Arc::new(RefCell::new(vec![1, 2, 3]));let data_clone = Arc::clone(&shared_data);let handle = thread::spawn(move || {let mut data = data_clone.borrow_mut();data.push(4);println!("Thread modified: {:?}", data);});handle.join().unwrap();println!("Main sees: {:?}", shared_data.borrow());println!("i32 is Send: {}", std::marker::Send);println!("i32 is Sync: {}", std::marker::Sync);println!("RefCell<T> is Send: {}", std::marker::Send);println!("RefCell<T> is Sync: {}", std::marker::Sync);}
Erklärung
1
Arc::new(...)
Atomisch referenzgezählt; erlaubt gemeinsame Ownership über Threads hinweg
2
RefCell<T>
Interior mutability; Borrow-Checking passiert zur Laufzeit
3
Arc::clone(&shared_data)
Erhöht Referenzzähler; billiger Pointer-Kopiervorgang
4
RefCell<T> ist NICHT Sync
Sync erfordert &T als Send; RefCell erlaubt nur einen Borrower gleichzeitig
5
std::marker::Send/Sync
Compiler stellt automatische Implementierungen für Basis-Typen bereit