spin

std::sync::Mutex e os outros primitivos de sincronização de std::sync não estão disponíveis em core ou alloc. Como podemos gerenciar a sincronização ou mutabilidade interna, como para compartilhar estado entre diferentes CPUs?

O crate spin fornece equivalentes baseados em spinlock para muitos dessas primitivas.

use spin::mutex::SpinMutex;

static counter: SpinMutex<u32> = SpinMutex::new(0);

fn main() {
    println!("count: {}", counter.lock());
    *counter.lock() += 2;
    println!("count: {}", counter.lock());
}
  • Tome cuidado para evitar deadlock se você tomar locks em manipuladores de interrupção.
  • spin também possui uma implementação de mutex de ticket lock; equivalentes de RwLock, Barrier e Once de std::sync; e Lazy para inicialização lazy ("preguiçosa").
  • O crate once_cell também possui alguns tipos úteis para inicialização tardia com uma abordagem um pouco diferente de spin::once::Once.
  • O Rust Playground inclui spin, portanto, este exemplo será executado corretamente inline.