#semaphore #sem #sem-open #create-semaphore

bin+lib named-sem

Linux & Windows 的命名信号量

2 个不稳定版本

0.2.0 2024年2月26日
0.1.0 2024年1月3日

#305操作系统

22 每月下载量

MIT/Apache

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(())
}

用法

命名信号量的一个常见用法是控制系统中的进程数。

例如,我们有两个大型目录,ABCD,需要压缩。而我们的计算机硬件只能同时运行两个 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