Struct SPMCBuffer

Source
pub struct SPMCBuffer<T: Send + Sync> { /* private fields */ }
Expand description

A single-producer multiple-consumer buffer, useful for thread-safe data sharing in scenarios where triple buffering won’t cut it.

Triple buffering is an extremely efficient synchronization protocol when a producer thread wants to constantly update a value that is visible by a single consumer thread. However, it is not safe to use in the presence of multiple consumers, because a consumer thread can no longer assume that it is the only thread having access to the read buffer and discard said read buffer at will.

Reference counting techniques can be used to build a variant of triple buffering which works for multiple consumers, remains provably wait-free if one uses two buffers per consumer, and degrades gracefully when a smaller amount of buffers is used as long as consumers frequently fetch updates from the producer. I call the resulting synchronization primitive an SPMC buffer.

Implementations§

Source§

impl<T: Clone + Send + Sync> SPMCBuffer<T>

Source

pub fn new(read_buffers: usize, initial: T) -> Self

Initialize an SPMC buffer with a certain amount of read buffers (which roughly determines how many readers can be accessing the structure at a slow pace before the writer starts to block).

Source§

impl<T: Default + Send + Sync> SPMCBuffer<T>

Source

pub fn with_default(read_buffers: usize) -> Self

Like “new”, but uses default-constructed values of type T instead of cloning a user-provided initial value of this type.

Source§

impl<T: Send + Sync> SPMCBuffer<T>

Source

pub fn split(self) -> (SPMCBufferInput<T>, SPMCBufferOutput<T>)

Extract input and output of the SPMC buffer

Trait Implementations§

Source§

impl<T: Clone + Send + Sync> Clone for SPMCBuffer<T>

Source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T: Debug + Send + Sync> Debug for SPMCBuffer<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T: PartialEq + Send + Sync> PartialEq for SPMCBuffer<T>

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.

Auto Trait Implementations§

§

impl<T> Freeze for SPMCBuffer<T>

§

impl<T> !RefUnwindSafe for SPMCBuffer<T>

§

impl<T> Send for SPMCBuffer<T>

§

impl<T> Sync for SPMCBuffer<T>

§

impl<T> Unpin for SPMCBuffer<T>

§

impl<T> !UnwindSafe for SPMCBuffer<T>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.