#自旋锁 #抽象 #top #锁API #共享 #封装 #自旋

spinning_top

基于lock_api提供的抽象的简单自旋锁crate

9个版本

0.3.0 2023年10月19日
0.2.5 2023年2月24日
0.2.4 2021年5月13日
0.2.3 2021年4月1日
0.1.0 2020年2月12日

#99 in 并发

Download history 53909/week @ 2024-04-20 53237/week @ 2024-04-27 54275/week @ 2024-05-04 56536/week @ 2024-05-11 64859/week @ 2024-05-18 53205/week @ 2024-05-25 62700/week @ 2024-06-01 66478/week @ 2024-06-08 64417/week @ 2024-06-15 69155/week @ 2024-06-22 68065/week @ 2024-06-29 68341/week @ 2024-07-06 60311/week @ 2024-07-13 66674/week @ 2024-07-20 70397/week @ 2024-07-27 70884/week @ 2024-08-03

279,393每月下载量
用于211个crate(12个直接使用)

MIT/Apache

53KB
552 代码行

spinning_top

image of a spinning top

Build Status Docs.rs Badge

基于lock_api提供的抽象的简单自旋锁crate。

示例

首先,将crate作为依赖项导入到你的Cargo.toml中。然后你可以按以下方式使用它

use spinning_top::Spinlock;

fn main() {
    // Wrap some data in a spinlock
    let data = String::from("Hello");
    let spinlock = Spinlock::new(data);
    make_uppercase(&spinlock); // only pass a shared reference
    // We have ownership of the spinlock, so we can extract the data without locking
    // Note: this consumes the spinlock
    let data = spinlock.into_inner();
    assert_eq!(data.as_str(), "HELLO");
}

fn make_uppercase(spinlock: &Spinlock<String>) {
    // Lock the spinlock to get a mutable reference to the data
    let mut locked_data = spinlock.lock();
    assert_eq!(locked_data.as_str(), "Hello");
    locked_data.make_ascii_uppercase();

    // the lock is automatically freed at the end of the scope
}

Spinlock::new是一个const函数。这使得Spinlock类型可以在静态中使用

use spinning_top::Spinlock;

static DATA: Spinlock<u32> = Spinlock::new(0);

fn main() {
    let mut data = DATA.lock();
    *data += 1;
    assert_eq!(*data, 1);
}

许可

许可如下

任选其一。

除非你明确声明,否则你故意提交的、根据Apache-2.0许可证定义的作品中的任何贡献,都应按上述方式双许可,不附加任何额外条款或条件。

依赖

~175KB