Expand description
§ParColl
This crate provides optimized collections which can be used in concurrent runtimes.
It provides optimized ring-based SPSC
(const bounded or unbounded),
SPMC (const bounded or unbounded),
and const bounded MPMC queue.
All queues are lock-free (or lock-free with the proper generics), generalized and can be either be cache-padded or not.
use parcoll::{Consumer, Producer};
fn mpmc() {
let (producer, consumer) = parcoll::mpmc::new_cache_padded_bounded::<_, 256>();
let producer2 = producer.clone();
let consumer2 = consumer.clone(); // You can clone the consumer
producer.maybe_push(1).unwrap();
producer.maybe_push(2).unwrap();
let mut slice = [std::mem::MaybeUninit::uninit(); 3];
let popped = consumer.pop_many(&mut slice);
assert_eq!(popped, 2);
assert_eq!(unsafe { slice[0].assume_init() }, 1);
assert_eq!(unsafe { slice[1].assume_init() }, 2);
}
fn spsc_unbounded() {
let (producer, consumer) = parcoll::spsc::new_cache_padded_unbounded();
producer.maybe_push(1).unwrap();
producer.maybe_push(2).unwrap();
let mut slice = [std::mem::MaybeUninit::uninit(); 3];
let popped = consumer.pop_many(&mut slice);
assert_eq!(popped, 2);
assert_eq!(unsafe { slice[0].assume_init() }, 1);
assert_eq!(unsafe { slice[1].assume_init() }, 2);
}
fn spmc() {
let (producer1, consumer1) = parcoll::spmc::new_bounded::<_, 256>();
let (producer2, consumer2) = parcoll::spmc::new_bounded::<_, 256>();
for i in 0..100 {
producer1.maybe_push(i).unwrap();
}
consumer1.steal_into(&producer2);
assert_eq!(producer2.len(), 50);
assert_eq!(consumer1.len(), 50);
}Re-exports§
pub use orengine_utils;
Modules§
- buffer_
version - mpmc
- This module contains the implementation of the MPMC queue.
- multi_
consumer - This module provides the
MultiConsumer, theMultiConsumerSpawner, theMultiLockFreeConsumerSpawnerand theMultiLockFreeConsumertraits for multi-consumer queues. - multi_
producer - This module provides the
MultiProducer, theMultiProducerSpawner, theMultiLockFreeProducerand theMultiLockFreeProducerSpawnertraits. - naive_
rw_ lock - This module provides
NaiveRWLockand its guards. - number_
types - single_
consumer - This module provides the
SingleConsumer, theSingleConsumerSpawner, theSingleLockFreeConsumerSpawnerand theSingleLockFreeConsumertraits for single-consumer queues. - single_
producer - spmc
- This module provides implementations of single-producer multi-consumer queues.
- spmc_
producer - spsc
- This module provides implementations of single-producer single-consumer queues.
- sync_
cell - This module provides the
SyncCelland theLockFreeSyncCelltraits.
Structs§
- Light
Arc - A light-weight reference-counted pointer to a value.
- Mutex
VecQueue - A wrapper around
LightArc<Mutex<VecQueue<T>>>. It can be used as a global queue. - VecQueue
- A queue that uses a vector to store the elements.
Enums§
- Lock
Free PopErr - Represents the possible errors that can occur when lock-free popping a value from a queue.
- Lock
Free Push Err - Represents the possible errors that can occur when lock-free pushing a value into a queue.
- Lock
Free Push Many Err - Represents the possible errors that can occur when lock-free pushing many values into a queue.
Traits§
- Batch
Receiver - A batch receiver of the multi-consumer queue. It is used to move half of the values from the queue to this receiver on overflow.
- Consumer
- A consumer of a queue.
- Lock
Free Batch Receiver - A lock-free batch receiver of the multi-consumer queue. It is used to move half of the values from the queue to this receiver on overflow.
- Lock
Free Consumer - A lock-free consumer of a queue.
- Lock
Free Producer - A lock-free producer of a queue.
- Producer
- A producer of a queue.