spin
std::sync::Mutex と、std::sync のその他の同期プリミティブは、core や alloc では利用できません。異なる 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::syncのRwLock・Barrier・Onceに相当するもの、そして遅延初期化のためのLazyもあります。once_cellクレートにも、spin::once::Onceとは少し異なるアプローチによる、遅延初期化用の便利な型がいくつかあります。- Rust Playground には
spinが含まれているため、この例はインラインでも問題なく実行できます。