use std::sync::atomic::{AtomicU64, Ordering};
static NEXT_THREAD_ID: AtomicU64 = AtomicU64::new(1);
thread_local! {
static COUNTER: u64 = NEXT_THREAD_ID.fetch_add(1, Ordering::Relaxed);
}
pub fn current_thread() -> u64 {
COUNTER.with(|&counter| counter)
}
#[cfg(test)]
mod tests {
use std::collections::HashSet;
use super::current_thread;
#[test]
fn various() {
let id0 = current_thread();
assert_eq!(id0, current_thread());
let threads = (0..100)
.map(|_| {
std::thread::spawn(|| {
let id = current_thread();
assert_eq!(id, current_thread());
id
})
})
.collect::<Vec<_>>();
let mut ids = HashSet::from([id0]);
ids.extend(threads.into_iter().map(|thr| thr.join().unwrap()));
assert_eq!(ids.len(), 101);
assert_eq!(id0, current_thread());
assert!(ids.into_iter().all(|id| id != 0));
}
}