#ring-buffer #locking #zig #read #sequentially #shared #thread

zsling

Rust封装了Zig语言编写的顺序锁(SeqLock)环形缓冲区

4个版本

0.1.2 2023年2月19日
0.1.1 2023年2月2日
0.1.0 2023年1月31日
0.0.1 2023年1月31日

并发类别中排名第1051

MIT许可证

34KB
632

该Crates提供顺序锁定的环形缓冲区。它允许快速且非写入者阻塞的SPMC队列,其中所有消费者都读取所有消息。

原文

这是sling Crates的Rust封装的Zig版本。请注意,由于当前实现中的限制,缓冲区大小设置为256,消息设置为[u8; 8]。

用法

有两种从队列中消费的方式。如果线程通过共享引用共享一个SharedReader,它们将相互窃取队列项目,这样就没有两个线程会读取相同的消息。当SharedReader被克隆时,新的SharedReader的读取进度将不再影响另一个。如果两个线程各自使用一个单独的SharedReader,它们将能够读取相同的消息。

# use zsling::*;

let buffer = RingBuffer::new();

let mut writer = buffer.try_lock().unwrap();
let mut reader = buffer.reader();

std::thread::scope(|s| {
    let reader = &reader;
    for t in 0..8 {
        s.spawn(move || {
            for _ in 0..100 {
                if let Some(val) = reader.pop_front() {
                    println!("t: {}, val: {:?}", t, val);
                };
            }
        });
    }

    for i in 0..100 {
        writer.push_back([0, 1, 2, 3, 4, 5, 6, 7]);
    }
});

重要!

还应注意,如果慢速读者没有足够快地消费消息,它们将被写者超过。如果缓冲区大小不够大,这种情况可能会很频繁。建议根据具体情况进行测试,找到最适合您用例的缓冲区大小。

依赖项

~93KB