Thanks to visit codestin.com
Credit goes to docs.rs

Crate parcoll

Crate parcoll 

Source
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, the MultiConsumerSpawner, the MultiLockFreeConsumerSpawner and the MultiLockFreeConsumer traits for multi-consumer queues.
multi_producer
This module provides the MultiProducer, the MultiProducerSpawner, the MultiLockFreeProducer and the MultiLockFreeProducerSpawner traits.
naive_rw_lock
This module provides NaiveRWLock and its guards.
number_types
single_consumer
This module provides the SingleConsumer, the SingleConsumerSpawner, the SingleLockFreeConsumerSpawner and the SingleLockFreeConsumer traits 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 SyncCell and the LockFreeSyncCell traits.

Structs§

LightArc
A light-weight reference-counted pointer to a value.
MutexVecQueue
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§

LockFreePopErr
Represents the possible errors that can occur when lock-free popping a value from a queue.
LockFreePushErr
Represents the possible errors that can occur when lock-free pushing a value into a queue.
LockFreePushManyErr
Represents the possible errors that can occur when lock-free pushing many values into a queue.

Traits§

BatchReceiver
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.
LockFreeBatchReceiver
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.
LockFreeConsumer
A lock-free consumer of a queue.
LockFreeProducer
A lock-free producer of a queue.
Producer
A producer of a queue.