use std::thread; use std::sync::Arc; use std::sync::atomic::{AtomicUsize, Ordering}; fn main() { let my_val = AtomicUsize::new(0); let pointer = Arc::new(my_val); let t_pointer = pointer.clone(); let handle = thread::Builder::new() .name("my thread".to_owned()) .spawn(move || { for _ in 0..250_000 { t_pointer.fetch_add(1, Ordering::Relaxed); } }) .expect("could not create the thread"); for _ in 0..250_000 { pointer.fetch_add(1, Ordering::Relaxed); } if handle.join().is_err() { println!("Something bad happened :("); } let a_int = Arc::try_unwrap(pointer).unwrap(); println!("Final number: {}", a_int.into_inner()); }