#node #queue #linked-list #wait-free #reusable #producer #spsc

llq

无等待的SPSC链表队列,节点可单独重用

1个不稳定版本

0.1.1 2021年4月25日
0.1.0 2021年4月25日

#980并发

Download history 70/week @ 2024-03-14 71/week @ 2024-03-21 133/week @ 2024-03-28 124/week @ 2024-04-04 184/week @ 2024-04-11 230/week @ 2024-04-18 130/week @ 2024-04-25 157/week @ 2024-05-02 78/week @ 2024-05-09 114/week @ 2024-05-16 221/week @ 2024-05-23 415/week @ 2024-05-30 1514/week @ 2024-06-06 1186/week @ 2024-06-13 995/week @ 2024-06-20 309/week @ 2024-06-27

4,079 每月下载量
用于 6 个crates (3 直接)

MIT/Apache

11KB
198

llq

Cargo Documentation

一个无等待的单生产者单消费者链表队列,节点可单独重用。

队列操作不会阻塞或分配内存。单个节点单独分配和管理,可以在多个队列中重用。

示例

使用队列在线程之间发送值

use llq::{Node, Queue};

let (mut producer, mut consumer) = Queue::<usize>::new().split();

producer.push(Node::new(0));
producer.push(Node::new(1));
producer.push(Node::new(2));

std::thread::spawn(move || {
    assert_eq!(*consumer.pop().unwrap(), 0);
    assert_eq!(*consumer.pop().unwrap(), 1);
    assert_eq!(*consumer.pop().unwrap(), 2);
    assert!(consumer.pop().is_none());
}).join().unwrap();

在多个队列之间重用节点

use llq::{Node, Queue};

let (mut producer1, mut consumer1) = Queue::<usize>::new().split();
let (mut producer2, mut consumer2) = Queue::<usize>::new().split();

let node = Node::new(3);
producer1.push(node);
let node = consumer1.pop().unwrap();
producer2.push(node);
let node = consumer2.pop().unwrap();

assert_eq!(*node, 3);

许可证

llq 以MIT许可和Apache许可版本2.0的条款分发。贡献也在此条款下接受。

无运行时依赖