// spawn.rs
fn main() {
let handle = thread::spawn(|| {
// new thread begins
});
}
// shared memory
let data = Arc::new(Mutex::new(0));
let d = Arc::clone(&data);
thread::spawn(move || {
let mut val = d.lock().unwrap();
*val += 1;
});
// race condition
// UNSAFE: no synchronization
static mut COUNTER: i32 = 0;
// Thread A: COUNTER += 1;
// Thread B: COUNTER += 1;
// Result: undefined
// mutex acquire
let guard = mutex.lock();
// critical section
// only one thread here
drop(guard); // release
// barrier sync
let barrier = Arc::new(Barrier::new(4));
// all 4 threads must arrive
barrier.wait();
// proceed together
// join
for handle in handles {
handle.join().unwrap();
}
// all threads complete