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
}