ask*_*sky 10

系统信号量是指操作系统提供的任何信号#include <semaphore.h>在 POSIX(Linux、MacOS)上,这些是您从(手册页)获得的方法。std::sync::Semaphore是用 Rust 实现的,并且与操作系统的信号量是分开的,尽管它确实使用了一些操作系统级别的同步原语(基于Linuxstd::sync::Condvar)。 从未稳定下来。Semaphore 的源代码包含不稳定的属性pthread_cond_tstd::sync::Semaphore

#![unstable(feature = "semaphore",
            reason = "the interaction between semaphores and the acquisition/release \
                      of resources is currently unclear",
            issue = "27798")]
Run Code Online (Sandbox Code Playgroud)

标题中的问题编号指定了有关此功能的讨论

其中最好的替代std是 astd::sync::CondVar或繁忙循环与std::sync::Mutex. CondVar如果您认为可能等待超过几千个时钟周期,请选择繁忙循环。

的文档Condvar有一个很好的示例,说明如何将其用作(二进制)信号量

use std::sync::{Arc, Mutex, Condvar};
use std::thread;

let pair = Arc::new((Mutex::new(false), Condvar::new()));
let pair2 = Arc::clone(&pair);

// Inside of our lock, spawn a new thread, and then wait for it to start.
thread::spawn(move|| {
    let (lock, cvar) = &*pair2;
    let mut started = lock.lock().unwrap();
    *started = true;
    // We notify the condvar that the value has changed.
    cvar.notify_one();
});

// Wait for the thread to start up.
let (lock, cvar) = &*pair;
let mut started = lock.lock().unwrap();
while !*started {
    started = cvar.wait(started).unwrap();
}
Run Code Online (Sandbox Code Playgroud)

Mutex::new(false)通过更改为Mutex::new(0)和一些相应的更改,可以将该示例改编为计数信号量。