low-latency-data-structures 0.0.7

Experimental lock-free SPSC, SPMC broadcast, and SeqLock primitives tuned for ultra-low-latency systems
Documentation
//! Minimal SPMC broadcast demo: one producer publishes a few values, two
//! consumer threads each receive every value independently.

use std::thread;

use low_latency_data_structures::mem::Allocator;
use low_latency_data_structures::mem::global::GlobalAllocator;
use low_latency_data_structures::spmc::{self, ReadResult};

fn main() {
    let (producer, mut c1) = spmc::new::<u64, 16, GlobalAllocator>(spmc::Options::global_mlocked());
    let mut c2 = c1.clone();

    let producer_h = thread::spawn(move || {
        for i in 0..8 {
            producer.publish(i);
        }
    });

    let consumer_a = thread::spawn(move || collect(&mut c1, 8));
    let consumer_b = thread::spawn(move || collect(&mut c2, 8));

    producer_h.join().unwrap();
    let a = consumer_a.join().unwrap();
    let b = consumer_b.join().unwrap();
    println!("consumer A observed: {a:?}");
    println!("consumer B observed: {b:?}");
}

fn collect<A>(c: &mut spmc::Consumer<u64, 16, A>, n: usize) -> Vec<u64>
where
    A: Allocator,
{
    let mut seen = Vec::with_capacity(n);
    while seen.len() < n {
        match c.try_read() {
            ReadResult::Value(v) => seen.push(v),
            ReadResult::Lapped { skipped } => {
                eprintln!("consumer lapped, skipped {skipped} values");
            }
            ReadResult::Empty => std::hint::spin_loop(),
        }
    }
    seen
}