spin
std::sync::Mutex and the other synchronisation primitives from std::sync are
not available in core or alloc. How can we manage synchronisation or
interior mutability, such as for sharing state between different CPUs?
The spin crate provides spinlock-based equivalents of many of these
primitives.
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
use spin::mutex::SpinMutex;
static COUNTER: SpinMutex<u32> = SpinMutex::new(0);
fn main() {
dbg!(COUNTER.lock());
*COUNTER.lock() += 2;
dbg!(COUNTER.lock());
}
- Be careful to avoid deadlock if you take locks in interrupt handlers.
spinalso has a ticket lock mutex implementation; equivalents ofRwLock,BarrierandOncefromstd::sync; andLazyfor lazy initialization.- The
once_cellcrate also has some useful types for late initialization with a slightly different approach tospin::once::Once. - The Rust Playground includes
spin, so this example will run fine inline.