spin

corealloc 中无法使用 std::sync::Mutexstd::sync 中的其他同步基元。那么该如何管理同步或内部可变性,例如在不同 CPU 之间共享状态?

spin crate 为许多基元提供了基于自旋锁的等效方法。

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 crate 也提供了一些适用于延迟初始化的实用类型,它们与 spin::once::Once 所用方法略有不同。
  • Rust Playground 中包含 spin,因此本示例将以内嵌方式正常运行。