capypad
0 Tage Serie
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
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::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