[−][src]Struct conquer_util::BoundedThreadLocal
A lock-free bounded per-value thread local storage.
Methods
impl<'s, T: Default> BoundedThreadLocal<'s, T>
[src]
pub fn with_buffer(buffer: &'s [Local<T>]) -> Self
[src]
Creates a new Default
initialized BoundedThreadLocal
that
borrows the specified buffer
.
pub fn new(max_threads: usize) -> Self
[src]
Creates a new Default
initialized BoundedThreadLocal
that
internally allocates a buffer of max_size
.
Panics
This method panics, if max_size
is 0.
impl<'s, T> BoundedThreadLocal<'s, T>
[src]
pub fn with_buffer_and_init(
buffer: &'s [Local<T>],
init: impl Fn() -> T
) -> Self
[src]
buffer: &'s [Local<T>],
init: impl Fn() -> T
) -> Self
Creates a new BoundedThreadLocal
that borrows the specified
buffer
and initializes each Local
with init
.
If the the buffer
has previously used by a BoundedThreadLocal
,
the previous values are dropped upon initialization.
Examples
use conquer_util::{BoundedThreadLocal, Local}; let buf: [Local<i32>; 3] = [Local::new(), Local::new(), Local::new()]; let tls = BoundedThreadLocal::with_buffer_and_init(&buf, || -1); assert_eq!(tls.thread_token().unwrap().get(), &-1); assert_eq!(tls.thread_token().unwrap().get(), &-1); assert_eq!(tls.thread_token().unwrap().get(), &-1); assert!(tls.thread_token().is_err());
pub fn with_init(max_threads: usize, init: impl Fn() -> T) -> Self
[src]
Creates a new BoundedThreadLocal
that internally allocates a buffer
of max_size
and initializes each Local
with init
.
Panics
This method panics, if max_size
is 0.
pub fn thread_token(&self) -> Result<Token<T>, BoundsError>
[src]
Returns a thread local token to a unique instance of T
.
The thread local instance will not be dropped, when the token itself is dropped and can e.g. be iterated afterwards.
Errors
This method fails, if the maximum number of tokens for this
BoundedThreadLocal
has already been acquired.
Examples
use conquer_util::BoundedThreadLocal; let tls = BoundedThreadLocal::new(1); let mut token = tls.thread_token()?; token.update(|local| *local = 1); assert_eq!(token.get(), &1);
ⓘImportant traits for IterMut<'s, 'tls, T>pub fn iter(&mut self) -> IterMut<'s, '_, T>
[src]
Creates an IterMut
over all Local
instances.
The iterator itself yields immutable items but the method itself requires a mutable reference in order to ensure there can be no concurrent accesses by other threads during the iteration.
Examples
use std::thread; use std::sync::Arc; use conquer_util::BoundedThreadLocal; const THREADS: usize = 4; let counter = Arc::new(BoundedThreadLocal::new(THREADS)); let handles: Vec<_> = (0..THREADS) .map(|id| { let counter = Arc::clone(&counter); thread::spawn(move || { let mut token = counter.thread_token().unwrap(); token.update(|curr| *curr = id) }) }) .collect(); for handle in handles { handle.join().unwrap(); } let mut counter = Arc::try_unwrap(counter).unwrap(); let sum: usize = counter.iter().map(|c| *c).sum(); assert_eq!(sum, (0..4).sum());
Trait Implementations
impl<'s, T> IntoIterator for BoundedThreadLocal<'s, T>
[src]
type Item = T
The type of the elements being iterated over.
type IntoIter = IntoIter<'s, T>
Which kind of iterator are we turning this into?
fn into_iter(self) -> Self::IntoIter
[src]
impl<'_, T> Send for BoundedThreadLocal<'_, T>
[src]
impl<'_, T> Sync for BoundedThreadLocal<'_, T>
[src]
impl<'_, T> Debug for BoundedThreadLocal<'_, T>
[src]
Auto Trait Implementations
impl<'s, T> Unpin for BoundedThreadLocal<'s, T>
impl<'s, T> !RefUnwindSafe for BoundedThreadLocal<'s, T>
impl<'s, T> !UnwindSafe for BoundedThreadLocal<'s, T>
Blanket Implementations
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<I> IntoIterator for I where
I: Iterator,
[src]
I: Iterator,
type Item = <I as Iterator>::Item
The type of the elements being iterated over.
type IntoIter = I
Which kind of iterator are we turning this into?
fn into_iter(self) -> I
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
V: MultiLane<T>,