Rust
Beginner
1 min read
Shared State with Arc<Mutex<T>>
Example
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());
}