spin

std::sync::Mutex と、std::sync のその他の同期プリミティブは、corealloc では利用できません。異なる CPU 間で状態を共有する場合など、同期や内部可変性をどのように管理すればよいのでしょうか。

spin クレートは、これらのプリミティブの多くについて、スピンロックベースの同等物を提供します。

// 著作権 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());
}
  • 割り込みハンドラ内でロックを取得する場合は、デッドロックを避けるよう注意してください。
  • spin には、チケットロック mutex 実装、std::syncRwLockBarrierOnce に相当するもの、そして遅延初期化のための Lazy もあります。
  • once_cell クレートにも、spin::once::Once とは少し異なるアプローチによる、遅延初期化用の便利な型がいくつかあります。
  • Rust Playground には spin が含まれているため、この例はインラインでも問題なく実行できます。