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, тож цей приклад добре працюватиме вбудовано.