pub struct AtomicArc<T> { /* private fields */ }Expand description
A lightweight atomic pointer to Arc.
Note: The imlementation manipuates the internal reference count of the
original Arc for optimization. This means that the result of
Arc::strong_count is incorrect, until the Arc gets rid of
this pointer’s control (with AtomicArc::swap). Users who depend on the
correctness of Arc::strong_count should be careful.
§Limitations
The implementation borrows some bits from the Arc pointer as an external
reference count (a technique called “split reference counting”). It
will panic in some extreame scenario when the reference count is increased
more than a threshold (2^15) at the same time. This is almost impossible
unless someone creates more than 2^15 threads to load the same pointer at
the same time.
§Examples
use std::{
sync::{atomic::Ordering, Arc},
thread,
};
use atomic_ext::AtomicArc;
let a = Arc::new(1);
let b = Arc::new(2);
let x = Arc::new(AtomicArc::new(a));
{
let x = x.clone();
thread::spawn(move || {
x.swap(Some(b), Ordering::AcqRel) // Returns `a`
});
}
{
let x = x.clone();
thread::spawn(move || {
x.load(Ordering::Acquire) // Returns either `a` or `b`
});
};Implementations§
Trait Implementations§
impl<T> Send for AtomicArc<T>
impl<T> Sync for AtomicArc<T>
Auto Trait Implementations§
impl<T> !Freeze for AtomicArc<T>
impl<T> RefUnwindSafe for AtomicArc<T>where
T: RefUnwindSafe,
impl<T> Unpin for AtomicArc<T>
impl<T> UnwindSafe for AtomicArc<T>where
T: RefUnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more