2 个不稳定版本
0.2.0 | 2024年2月26日 |
---|---|
0.1.0 | 2024年1月3日 |
#305 在 操作系统
22 每月下载量
19KB
266 行
命名信号量
Linux & Windows 的命名信号量。
要使用此crate,请在 Cargo.toml
中添加以下内容
[dependencies]
named-sem = "0.1"
背景
命名信号量是Linux & Windows的操作系统和libc提供的进程同步机制。通过给信号量命名,具有适当权限的进程可以共享同一个信号量。
在Linux中,我们使用POSIX信号量作为实现,在Windows中,我们使用信号量对象。
示例
use named_sem::{NamedSemaphore, Error};
# fn do_heavy_things() {}
fn use_named_semaphore() -> Result<(), Error> {
// In Linux, the semaphore's name should begin with "/"
let mut semaphore = NamedSemaphore::create("/my-semaphore", 3)?;
semaphore.wait_then_post(|| {
do_heavy_things();
})?;
Ok(())
}
用法
命名信号量的一个常见用法是控制系统中的进程数。
例如,我们有两个大型目录,A
,B
,C
和 D
,需要压缩。而我们的计算机硬件只能同时运行两个 7z
进程。所以我们可以创建一个初始值为2的命名信号量,并在每次运行 7z
之前请求信号量。
在这个仓库中有一个名为 preempt-do
的小工具。通过以下方式编译它
cargo build --release --features=commandline --bin preempt-do
或者,您可以安装它
cargo install named-sem --features=commandline --bin preempt-do
然后您可以使用以下指令来完成上述操作
preempt-do --name /my-semaphore --count 2 -- 7z a A.7z A
preempt-do --name /my-semaphore --count 2 -- 7z a B.7z B
preempt-do --name /my-semaphore --count 2 -- 7z a C.7z C
preempt-do --name /my-semaphore --count 2 -- 7z a D.7z D
这将允许系统中不超过两个 7z
进程。
依赖
~0.3–36MB
~543K SLoC