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)和一些相应的更改,可以将该示例改编为计数信号量。