// Created on savesnippets.com ยท https://savesnippets.com/o8BJ6VnU137lev use std::sync::Arc; use std::sync::atomic::{AtomicU64, Ordering}; use std::thread; fn main() { let counter = Arc::new(AtomicU64::new(0)); let handles: Vec<_> = (0..16).map(|_| { let c = Arc::clone(&counter); thread::spawn(move || { for _ in 0..100_000 { c.fetch_add(1, Ordering::Relaxed); // Relaxed = no extra synchronization } }) }).collect(); for h in handles { h.join().unwrap(); } println!("final: {}", counter.load(Ordering::Relaxed)); // 1600000 // Relaxed is fine for a counter. Use Acquire/Release for flag-based // synchronization where the value's order matters. }