Lock-free queues for Nim, implemented as ring buffers.
Three implementations are provided:
Sipsic
is a single-producer, single-consumer bounded queue. Pushing and popping are wait-free.Mupsic
is a multi-producer, single-consumer bounded queue. Popping is wait-free.Mupmuc
is a multi-producer, multi-consumer bounded queue.
API documentation: https://elijahr.github.io/lockfreequeues
nimble install lockfreequeues
Examples are located in the examples directory and can be compiled and run with:
nimble examples
- Juho Snellman's post "I've been writing ring buffers wrong all these years" (alt)
- Mamy Ratsimbazafy's research on SPSC channels for weave.
- Henrique F Bucher's post "Yes, You Have Been Writing SPSC Queues Wrong Your Entire Life" (alt)
Many thanks to Mamy Ratsimbazafy for reviewing the initial release and offering suggestions.
- Pull requests and feature requests are welcome!
- Please file any issues you encounter.
- For pull requests, please see the contribution guidelines.
Tests can be run locally with nimble test
.
CI runs the test suite for both C and C++ targets on:
- Linux
x86_64
andaarch64
- macOS
x86_64
The test suite is also run with LLVM thread sanitization to check for data races.