[−][src]Crate lockfree_object_pool
A thread-safe object pool collection with automatic return and attach/detach semantics.
Some implementations are lockfree :
Other use std::Mutex :
And NoneObjectPool
basic allocation without pool.
Example
The general pool creation looks like this for
use lockfree_object_pool::LinearObjectPool; let pool = LinearObjectPool::<u32>::new( || Default::default(), |v| {*v = 0; }); // And use the object pool let mut item = pool.pull(); *item = 5;
At the end of the scope item return in object pool.
Multithreading
All implementation support allocation/desallocation from on or more thread. You only need to wrap the pool in a std::sync::Arc
:
use lockfree_object_pool::LinearObjectPool; use std::sync::Arc; let pool = Arc::new(LinearObjectPool::<u32>::new( || Default::default(), |v| {*v = 0; }));
Performance
Global report.
Allocation
ObjectPool | Duration in Monothreading (us) | Duration Multithreading (us) |
---|---|---|
NoneObjectPool | 1.2937 | 587.75 |
MutexObjectPool | 1.3143 | 1.3210 |
SpinLockObjectPool | 1.3170 | 1.2555 |
LinearObjectPool | 0.29399 | 0.19894 |
Report monothreading and multithreading.
Desallocation
ObjectPool | Duration in Monothreading (ns) | Duration Multithreading (ns) |
---|---|---|
NoneObjectPool | 114.22 | 25.474 |
MutexObjectPool | 26.173 | 99.511 |
SpinLockObjectPool | 22.490 | 52.378 |
LinearObjectPool | 9.9155 | 23.028 |
Report monothreading and multithreading.
Structs
LinearObjectPool | ObjectPool use a lockfree vector to secure multithread access to pull. |
LinearReusable | Wrapper over T used by |
MutexObjectPool | ObjectPool use a |
MutexReusable | Wrapper over T used by |
NoneObjectPool | Basic allocation without pull. Used to compare default rust allocation with different kind of object pool. |
NoneReusable | Wrapper over T used by |
SpinLockObjectPool | ObjectPool use a spin lock over vector to secure multithread access to pull. |
SpinLockReusable | Wrapper over T used by |