ringbuffer

Function ringbuffer 

Source
pub fn ringbuffer<T>(
    capacity: usize,
) -> (RingBufferWriter<T>, RingBufferReader<T>)
Expand description

Create a new ringbuffer with a fixed capacity.

§Panics

Panics if capacity is not a power of two.

This requirement enables a fast bitmask wrap for indices which avoids the cost of mod in the hot path.

§Returns

A (RingBufferWriter<T>, RingBufferReader<T>) pair where the writer is intended for the single producer and the reader for the single consumer.

Examples found in repository?
examples/throughput.rs (line 9)
7fn main() {
8    static COUNTER: AtomicUsize = AtomicUsize::new(0);
9    let (mut tx, mut rx) = ringbuffer::<usize>(2_usize.pow(10));
10
11    std::thread::spawn(move || loop {
12        if tx.push(1).is_some() {
13            std::thread::yield_now();
14        }
15    });
16
17    std::thread::spawn(move || loop {
18        if rx.pull().is_some() {
19            COUNTER.fetch_add(1, Ordering::Relaxed);
20        } else {
21            std::thread::yield_now();
22        }
23    });
24
25    static STEP: Duration = Duration::from_secs(1);
26    let start = Instant::now();
27    for i in 1..=u32::MAX {
28        std::thread::sleep(start + i * STEP - Instant::now());
29        println!("{} elem/s", COUNTER.swap(0, Ordering::Relaxed));
30    }
31}