Struct incr::AtomicIncr
source · pub struct AtomicIncr(/* private fields */);
Expand description
AtomicIncr
is a threadsafe, yet very fast counter, utilizing compare
and swap instructions to provide speed and safety in the same package.
There are some cases where 5ns matters. But in many, many other
situations, it’s a perfectly good decision to just use the AtomicIncr
,
knowing it can handle anything, and move on to other problems.
Examples
use std::thread::{spawn, JoinHandle};
use std::sync::{Arc, Barrier};
use incr::AtomicIncr;
let last: AtomicIncr = Default::default();
let barrier = Arc::new(Barrier::new(2));
let thread: JoinHandle<u64> = {
let barrier = Arc::clone(&barrier);
let last = last.clone();
spawn(move || {
assert_eq!(last.is_new(2), true);
assert_eq!(last.is_new(3), true);
assert_eq!(last.is_new(3), false);
barrier.wait();
last.get()
})
};
barrier.wait();
assert_eq!(last.is_new(3), false);
assert_eq!(thread.join().unwrap(), 3);
It’s also possible to access the inner Arc<AtomicU64>
by consuming the
outer wrapper:
use incr::AtomicIncr;
#[cfg(feature = "nightly")]
type Atomic = AtomicU64;
#[cfg(not(feature = "nightly"))]
type Atomic = AtomicUsize;
let stop = Arc::new(AtomicBool::new(false));
let last: AtomicIncr = Default::default();
let mut threads = Vec::new();
for _ in 0..5 {
let val: Arc<Atomic> = last.clone().into_inner();
let stop = Arc::clone(&stop);
threads.push(thread::spawn(move || {
loop {
val.fetch_add(1, Ordering::Relaxed);
thread::yield_now();
if stop.load(Ordering::Relaxed) { break }
}
}));
}
let mut i = 1;
for _ in 0..100 {
i = match last.is_new(i) {
true => i + 1,
false => i.max(last.get()),
};
}
stop.store(true, Ordering::SeqCst);
Implementations§
source§impl AtomicIncr
impl AtomicIncr
sourcepub fn is_new(&self, val: u64) -> bool
pub fn is_new(&self, val: u64) -> bool
Returns true
if val
is greater than the highest previously observed
value. If val
is a new maximum, it is stored in self
for checks against
future values subsequent calls Self::get(&self)
will return val
until a
new max is observed.
sourcepub fn get(&self) -> u64
pub fn get(&self) -> u64
Returns the current value of self
, which is the maximum observed value.
sourcepub fn into_inner(self) -> Arc<AtomicU64>
pub fn into_inner(self) -> Arc<AtomicU64>
Consumes the outer struct, returning the inner Arc<Atomic>
.
Trait Implementations§
source§impl Clone for AtomicIncr
impl Clone for AtomicIncr
source§fn clone(&self) -> AtomicIncr
fn clone(&self) -> AtomicIncr
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for AtomicIncr
impl Debug for AtomicIncr
source§impl Default for AtomicIncr
impl Default for AtomicIncr
source§fn default() -> AtomicIncr
fn default() -> AtomicIncr
source§impl From<u64> for AtomicIncr
impl From<u64> for AtomicIncr
source§impl PartialEq<AtomicIncr> for AtomicIncr
impl PartialEq<AtomicIncr> for AtomicIncr
source§impl PartialOrd<AtomicIncr> for AtomicIncr
impl PartialOrd<AtomicIncr> for AtomicIncr
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
self
and other
) and is used by the <=
operator. Read more