spin

std::syncが提供するstd::sync::Mutex とその他の同期プリミティブは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 also has a ticket lock mutex implementation; equivalents of RwLock, Barrier and Once from std::sync; and Lazy for lazy initialisation.
  • once_cell クレートもspin::once::Onceとは少し異なるアプローチの遅延初期化のための有用な型をいくつか持っています。
  • Rust Playgroundはspinを内包しているので、この例はオンラインで実行できます。