NonBlockingMutex
NonBlockingMutex
is needed to run actions
atomically without thread blocking, or context
switch, or spin lock contention, or rescheduling
on some scheduler
NonBlockingMutex
is faster than std::sync::Mutex
(both blocking and spinning)
when contention is high enough
Notice that NonBlockingMutex
doesn't guarantee order
of execution, only atomicity of operations is guaranteed
```rust use nonblockingmutex::NonBlockingMutex; use std::thread::{available_parallelism};
let maxconcurrentthreadcount = availableparallelism().unwrap().get();
let nonblockingmutex = NonBlockingMutex::new(maxconcurrentthreadcount, 0); nonblockingmutex.runiffirstorscheduleon_first(|mut state| { *state += 1; }); ```
| benchmarkname | time | |:----------------------------------------|----------:| | incrementoncewithoutmutex | 0.228 ns | | incrementonceundernonblockingmutex | 9.445 ns | | incrementonceundermutexblockingly | 8.851 ns | | incrementonceundermutex_spinny | 10.603 ns |
| Benchmark name | Operation count per thread | Spin under lock count | Concurrent thread count | averagetime | |:------------------------------------------------|---------------------------:|----------------------:|------------------------:|-------------:| | incrementundernonblockingmutexconcurrently | 1000 | 0 | 24 | 3.408 ms | | incrementundermutexblockinglyconcurrently | 1000 | 0 | 24 | 1.072 ms | | incrementundermutexspinnyconcurrently | 1000 | 0 | 24 | 4.376 ms | | incrementundernonblockingmutexconcurrently | 10000 | 0 | 24 | 42.584 ms | | incrementundermutexblockinglyconcurrently | 10000 | 0 | 24 | 14.960 ms | | incrementundermutexspinnyconcurrently | 10000 | 0 | 24 | 94.658 ms | | incrementundernonblockingmutexconcurrently | 1000 | 10 | 24 | 12.280 ms | | incrementundermutexblockinglyconcurrently | 1000 | 10 | 24 | 8.345 ms | | incrementundermutexspinnyconcurrently | 1000 | 10 | 24 | 34.977 ms | | incrementundernonblockingmutexconcurrently | 10000 | 10 | 24 | 70.013 ms | | incrementundermutexblockinglyconcurrently | 10000 | 10 | 24 | 84.143 ms | | incrementundermutexspinnyconcurrently | 10000 | 10 | 24 | 349.07 ms | | incrementundernonblockingmutexconcurrently | 1000 | 100 | 24 | 44.670 ms | | incrementundermutexblockinglyconcurrently | 1000 | 100 | 24 | 47.335 ms | | incrementundermutexspinnyconcurrently | 1000 | 100 | 24 | 117.570 ms | | incrementundernonblockingmutexconcurrently | 10000 | 100 | 24 | 378.230 ms | | incrementundermutexblockinglyconcurrently | 10000 | 100 | 24 | 801.090 ms | | incrementundermutexspinnyconcurrently | 10_000 | 100 | 24 | 1200.400 ms |