#atomic #monotonic #arc #box #container

no-std quinine

Atomic monotonic containers (Mono{Box,Arc})

2 unstable releases

0.2.0 Feb 17, 2022
0.1.0 Feb 17, 2022

#805 in Concurrency

Download history 384/week @ 2023-06-12 283/week @ 2023-06-19 513/week @ 2023-06-26 449/week @ 2023-07-03 443/week @ 2023-07-10 178/week @ 2023-07-17 436/week @ 2023-07-24 191/week @ 2023-07-31 307/week @ 2023-08-07 235/week @ 2023-08-14 148/week @ 2023-08-21 239/week @ 2023-08-28 306/week @ 2023-09-04 198/week @ 2023-09-11 131/week @ 2023-09-18 195/week @ 2023-09-25

830 downloads per month
Used in verneuil


550 lines


Crates.io docs.rs

Quinine implements atomic, lock-free, but write-once versions of containers like Option<Box<T>> (MonoBox) and Option<Arc<T>> (MonoArc).

These write-once containers can be read with mere Ordering::Acquire loads; reads otherwise perform like Box and Arc. On the write-side, atomic updates happen via compare-and-swaps, only the first of which will succeed.

The code is simpler (and likely faster) than, e.g., ArcSwap, because it exploits the monotonic nature of all updates to these write-once containers. That's particularly true for reads, but updates also avoid a lot of coordination overhead with potential concurrent readers.

When atomic containers can only transition monotonically from None to Some, and then stay there, we can implement simple update algorithms, without having to worry about the lifetime of references derived from the container: once we've observed Some value, the container can be trusted to keep it alive for us (until the container is dropped safely). The general form of this trick applies to any container that owns a monotonically increasing set of resources, until the container itself is destroyed.

No runtime deps