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

llq

Wait-free SPSC linked-list queue with individually reusable nodes

1 unstable release

0.1.1 Apr 25, 2021
0.1.0 Apr 25, 2021

#1019 in Concurrency

Download history 73/week @ 2023-12-18 80/week @ 2023-12-25 123/week @ 2024-01-01 83/week @ 2024-01-08 13/week @ 2024-01-15 28/week @ 2024-01-22 19/week @ 2024-01-29 58/week @ 2024-02-05 26/week @ 2024-02-12 90/week @ 2024-02-19 83/week @ 2024-02-26 69/week @ 2024-03-04 83/week @ 2024-03-11 72/week @ 2024-03-18 94/week @ 2024-03-25 148/week @ 2024-04-01

405 downloads per month
Used in 4 crates (3 directly)

MIT/Apache

11KB
198 lines

llq

Cargo Documentation

A wait-free single-producer single-consumer linked-list queue with individually reusable nodes.

Queue operations do not block or allocate memory. Individual nodes are allocated and managed separately, and can be reused on multiple queues.

Examples

Using a queue to send values between threads:

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();

Reusing a node between multiple queues:

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);

License

llq is distributed under the terms of both the MIT license and the Apache license, version 2.0. Contributions are accepted under the same terms.

No runtime deps