12 releases

new 0.1.13 Feb 10, 2025
0.1.12 Feb 10, 2025
0.1.11 Jan 29, 2025
0.1.9 Dec 30, 2022
0.1.3 Jul 27, 2022

#93 in Concurrency

Download history 16158/week @ 2024-10-22 12926/week @ 2024-10-29 13323/week @ 2024-11-05 13216/week @ 2024-11-12 13185/week @ 2024-11-19 11660/week @ 2024-11-26 15725/week @ 2024-12-03 16690/week @ 2024-12-10 12122/week @ 2024-12-17 5268/week @ 2024-12-24 8108/week @ 2024-12-31 12614/week @ 2025-01-07 16707/week @ 2025-01-14 13466/week @ 2025-01-21 15942/week @ 2025-01-28 12875/week @ 2025-02-04

61,364 downloads per month
Used in 52 crates (via zenoh-transport)

EPL-2.0 license

10KB
119 lines

ringbuffer-spsc

A fast single-producer single-consumer ring buffer. For performance reasons, the capacity of the buffer is determined at compile time via a const generic and it is required to be a power of two for a more efficient index handling.

Example

use ringbuffer_spsc::RingBuffer;

fn main() {
    const N: usize = 1_000_000;
    let (mut tx, mut rx) = RingBuffer::<usize, 16>::new();

    let p = std::thread::spawn(move || {
        let mut current: usize = 0;
        while current < N {
            if tx.push(current).is_none() {
                current = current.wrapping_add(1);
            } else {
                std::thread::yield_now();
            }
        }
    });

    let c = std::thread::spawn(move || {
        let mut current: usize = 0;
        while current < N {
            if let Some(c) = rx.pull() {
                assert_eq!(c, current);
                current = current.wrapping_add(1);
            } else {
                std::thread::yield_now();
            }
        }
    });

    p.join().unwrap();
    c.join().unwrap();
}

Dependencies

~145KB