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:

```rust use llq::{Node, Queue};

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

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

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

```

Reusing a node between multiple queues:

```rust use llq::{Node, Queue};

let (mut producer1, mut consumer1) = Queue::::new().split(); let (mut producer2, mut consumer2) = Queue::::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.