3 个版本

0.5.2 2024年4月12日
0.5.1 2024年4月12日
0.5.0 2024年4月12日

348并发

MIT 许可证

5KB
66

semrs

Build crates.io

这是一个无依赖项的、纯 Rust 实现的计数信号量。

Crates.io: https://crates.io/crates/semrs.

GitHub 仓库: https://github.com/obicons/semrs.

入门

cargo add semrs

或者将以下行添加到您的 Cargo.toml 文件中

semrs = "0.5.2"

关于

不幸的是,信号量的使用通常需要不安全块。本质上,信号量不提供独占访问。它提供 有限 访问。程序员必须确保访问最终是自由的,没有数据竞争。

尽管有这个严重的限制,信号量仍然是一个有用的并发原语。例如,可以使用信号量实现有限缓冲区来解决读者/写者问题,而不需要忙等待。信号量对于实现安全的并发原语很有用。

用法

// Two references to a binary semaphore.
let s1 = Arc::new(Semaphore::new(1));
let s2 = s1.clone();

// A shared resource, r, and a pointer to it, p.
let mut r = UnsafeCell::new(0);
let p: usize = r.get() as usize;

// Thread 1.
let t1 = std::thread::spawn(move || {
    s1.down();
    let p: *mut i32 = p as *mut i32;
    unsafe { *p += 1; }
    s1.up();
});

// Thread 2.
let t2 = std::thread::spawn(move || {
    s2.down();
    let p: *mut i32 = p as *mut i32;
    unsafe { *p += 1; }
    s2.up();
});

let _ = t1.join();
let _ = t2.join();

// The access was sychronized.
assert!(*r.get_mut() == 2);

无运行时依赖