Quinine
Quinine implements atomic, lock-free, but write-once versions of containers like Option
(MonoBox
) and Option
(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.