pub type Spinlock<T> = Mutex<RawSpinlock, T>;
Expand description
A mutual exclusion (Mutex) type based on busy-waiting.
Calling lock
(or try_lock
) on this type returns a SpinlockGuard
, which
automatically frees the lock when it goes out of scope.
§Example
use spinning_top::Spinlock;
fn main() {
// Wrap some data in a spinlock
let data = String::from("Hello");
let spinlock = Spinlock::new(data);
make_uppercase(&spinlock); // only pass a shared reference
// We have ownership of the spinlock, so we can extract the data without locking
// Note: this consumes the spinlock
let data = spinlock.into_inner();
assert_eq!(data.as_str(), "HELLO");
}
fn make_uppercase(spinlock: &Spinlock<String>) {
// Lock the spinlock to get a mutable reference to the data
let mut locked_data = spinlock.lock();
assert_eq!(locked_data.as_str(), "Hello");
locked_data.make_ascii_uppercase();
// the lock is automatically freed at the end of the scope
}
§Usage in statics
Spinlock::new
is a const
function. This makes the Spinlock
type
usable in statics:
ⓘ
use spinning_top::Spinlock;
static DATA: Spinlock<u32> = Spinlock::new(0);
fn main() {
let mut data = DATA.lock();
*data += 1;
assert_eq!(*data, 1);
}
Aliased Type§
struct Spinlock<T> { /* private fields */ }