Rust

Atomic Counter (lock-free)

admin by @admin ADMIN
1d ago
May 31, 2026
Public
0 0 up · 0 down Sign in to vote
For shared counters and flags, `AtomicU64` / `AtomicBool` etc. are much faster than `Mutex`. Operations like `fetch_add` are single CPU instructions on most architectures.
Rust
Raw
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.
}
Tags

Save your own code snippets

Create a free account and build your private vault. Share publicly whenever you want.