A Rust MPMC(multiple producer and multiple consumers) ringbuf queue
single thread
rust
let mut msg_queue:MsgQueue<u8> = MsgQueue::new();
let mut writer1 = msg_queue.add_producer();
let mut read1 = msg_queue.add_consumer();
writer1.write(vec![10;100]);
println!("{}",msg_queue.get_consumer_count());
println!("{}",read1.size());
assert_eq!(read1.size(),100);
let mut read2 = msg_queue.add_consumer();
assert_eq!(read2.size(),0);
assert_eq!(msg_queue.get_consumer_count(),2);
writer1.write(vec![0;100]);
assert_eq!(read1.size(),200);
assert_eq!(read2.size(),100);
read2.read(50);
assert_eq!(read1.size(),200);
assert_eq!(read2.size(),50);
multi-thread
```rust
let mut msgqueue: Arc
let t2 = thread::spawn(move || { let mut msglock = (*m2).lock().unwrap(); println!("get lock1"); let p = msglock.addproducer(); for i in 0..100{ p.write(vec![0;5]); } }); t1.join(); t2.join(); { let mut msglock = (*msgqueue).lock().unwrap(); asserteq!(msglock.getconsumercount(),2); let mut c1 = msglock.getconsumer(c1id); let mut c2 = msglock.getconsumer(c2id); println!("size: {} {}",c1.size(),c2.size()); asserteq!(c1.size(),1000); assert_eq!(c2.size(),1000); } ```
fixed mode: fixed data block size and with data overwrite
dynamic mode: dynamic data block size