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 ofRwLock
,Barrier
andOnce
fromstd::sync
; andLazy
for lazy initialisation.once_cell
クレートもspin::once::Once
とは少し異なるアプローチの遅延初期化のための有用な型をいくつか持っています。- Rust Playgroundは
spin
を内包しているので、この例はオンラインで実行できます。