spin
std::sync::Mutex
та інші примітиви синхронізації з std::sync
недоступні в core
або alloc
. Як ми можемо керувати синхронізацією або внутрішньою мутабельністю, наприклад, для обміну станом між різними CPU?
Крейт spin
надає еквіваленти багатьох із цих примітивів на основі спін-блокування.
use spin::mutex::SpinMutex; static counter: SpinMutex<u32> = SpinMutex::new(0); fn main() { println!("count: {}", counter.lock()); *counter.lock() += 2; println!("count: {}", counter.lock()); }
- Будьте обережні, щоб уникнути взаємоблокувань, якщо ви використовуєте блокування в обробниках переривань.
spin
також має реалізацію квиткового м'ютексу блокування; еквівалентиRwLock
,Barrier
іOnce
зstd::sync
; іLazy
для ледачої ініціалізації.- Крейт
once_cell
також має кілька корисних типів для пізньої ініціалізації з дещо іншим підходом доspin::once::Once
. - Rust Playground містить
spin
, тож цей приклад добре працюватиме вбудовано.