Back
Syntax
Study
Editor
Mode:
HTML
CSS
JavaScript
PHP
Reset
Run »
HTML / CSS / JS
use std::sync::{Arc, Mutex, RwLock}; use std::thread; fn main() { // --- Arc<Mutex<T>> shared counter --- let counter = Arc::new(Mutex::new(0u64)); let mut handles = vec![]; for _ in 0..8 { let c = Arc::clone(&counter); handles.push(thread::spawn(move || { let mut guard = c.lock().unwrap(); // blocks until lock acquired *guard += 1; })); // guard dropped → lock released } for h in handles { h.join().unwrap(); } println!("counter = {}", *counter.lock().unwrap()); // --- Arc<Mutex<Vec<T>>> shared collection --- let log: Arc<Mutex<Vec<String>>> = Arc::new(Mutex::new(Vec::new())); let mut handles = vec![]; for i in 0..4 { let log = Arc::clone(&log); handles.push(thread::spawn(move || { let msg = format!("thread {i} reporting"); log.lock().unwrap().push(msg); })); } for h in handles { h.join().unwrap(); } println!("log entries: {:?}", *log.lock().unwrap()); // --- RwLock: many readers, one writer --- let data = Arc::new(RwLock::new(vec![1, 2, 3])); let r1 = Arc::clone(&data); let r2 = Arc::clone(&data); let t1 = thread::spawn(move || { let guard = r1.read().unwrap(); println!("reader 1: {:?}", *guard); }); let t2 = thread::spawn(move || { let guard = r2.read().unwrap(); println!("reader 2: {:?}", *guard); }); t1.join().unwrap(); t2.join().unwrap(); data.write().unwrap().push(4); println!("after write: {:?}", *data.read().unwrap()); }
Result
Open