package picos_aux
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=862d61383e2df93a876bedcffb1fd1ddc0f96c50b0e9c07943a2aee1f0e182be
sha512=87805379017ef4a7f2c11b954625a3757a0f1431bb9ba59132202de278b3e41adbe0cdc20e3ab23b7c9a8c5a15faeb7ec79348e7d80f2b14274b00df0893b8c0
doc/picos_aux.mpmcq/Picos_aux_mpmcq/index.html
Module Picos_aux_mpmcq
Source
Lock-free multi-producer, multi-consumer queue.
🏎️ This data structure is optimized for use as a building block of the ready queue of a (mostly) fair (i.e. mostly FIFO) multi-threaded scheduler. For example, one could use a queue per thread, to reduce contention, and have threads attempt to pop fibers from the queues of other threads when their local queues are empty. It is also possible to use only a single shared queue, but that will result in very high contention as this queue is not relaxed.
API
A multi-producer, multi-consumer queue.
create ()
returns a new empty multi-producer, multi-consumer queue.
push_head queue value
adds the value
to the head of the queue
.
pop_exn queue
tries to remove the value at the head of the queue
. Returns the removed value or raises Empty
in case the queue was empty.
is_empty queue
is equivalent to length queue = 0
.
Examples
An example top-level session:
# let q : int Picos_aux_mpmcq.t =
Picos_aux_mpmcq.create ()
val q : int Picos_aux_mpmcq.t = <abstr>
# Picos_aux_mpmcq.push q 42
- : unit = ()
# Picos_aux_mpmcq.push_head q 76
- : unit = ()
# Picos_aux_mpmcq.length q
- : int = 2
# Picos_aux_mpmcq.push q 101
- : unit = ()
# Picos_aux_mpmcq.pop_exn q
- : int = 76
# Picos_aux_mpmcq.pop_exn q
- : int = 42
# Picos_aux_mpmcq.pop_exn q
- : int = 101
# Picos_aux_mpmcq.pop_exn q
Exception: Picos_aux_mpmcq.Empty.