3 个版本
0.5.2 | 2024年4月12日 |
---|---|
0.5.1 | 2024年4月12日 |
0.5.0 | 2024年4月12日 |
348 在 并发
5KB
66 行
semrs
这是一个无依赖项的、纯 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);