1 unstable release
0.1.0-preview | Feb 25, 2019 |
---|
#9 in #stm
185KB
5K
SLoC
swym
swym is an experimental STM that can be used to implement concurrent data structures with performance not far from lock-free data structures.
See the docs for more information.
Initial benchmarks can be found here.
lib.rs
:
A low level transaction memory library.
swym
is an experimental STM that can be used to implement concurrent data structures with
performance not far from lock-free data structures.
Examples
Getting a handle to swym's thread local state:
use swym::thread_key;
let thread_key = thread_key::get();
Creating new transactional memory cells:
use swym::tcell::TCell;
static A: TCell<i32> = TCell::new(0);
let b = TCell::new(42);
Performing a transaction to swap the two values:
thread_key.rw(|tx| {
let temp = A.get(tx, Default::default())?;
A.set(tx, b.get(tx, Default::default())?)?;
b.set(tx, temp)?;
Ok(())
});
Features
- Behaves as though a single global lock were held for the duration of every transaction. This
can be relaxed a bit using
Ordering::Read
for loads. - Highly optimized for read mostly data structures and modern caches.
TCell
stores all of its data inline. Read only transactions don't modify any global state, and read write transactions only modify global state on commit. - The number of allocations imposed by swym per transaction should average 0 through reuse of read logs/write logs/garbage bags.
- Support for building recursive data structures using
TPtr
is still experimental but looks promising - see examples on github. - Backed by a custom epoch based reclaimation style garbage collector (still lots of optimization work to do there).
- Support for nested transactions is planned, but not yet implemented.
Shared Memory
TCell
, a low level transactional memory location - does not perform any heap allocation.TPtr
, a low level transactional pointer for building heap allocated data structures.