我正在尝试使用单个消费者和单个生产者实现缓冲区。我只使用了 POSIX 信号量,但是,它们在 Rust 中不可用,我正在尝试使用 Rust 同步原语 ( Mutex, Condvar, Barrier, ...)实现一个微不足道的信号量问题,但我不想使用通道。
我的代码表现得太不规则了,在某些情况下运行良好,有时它只是在某个数字处停止,而在其他情况下它只是不开始计数。
如果我在主线程中等待 1 秒直到我发送Condvar通知,事情似乎会更好,但它并不能保证它不会进入死锁。
如何修复这个程序?我理解Condvar错了吗?
use std::thread;
use std::sync::{Arc, Condvar, Mutex};
struct Buffer {
is_data: Mutex<bool>,
is_data_cv: Condvar,
is_space: Mutex<bool>,
is_space_cv: Condvar,
buffer: Mutex<i32>,
}
fn producer(buffer: Arc<Buffer>) {
for i in 0..50 {
loop {
let mut is_space = buffer
.is_space_cv
.wait(buffer.is_space.lock().unwrap())
.unwrap();
if *is_space {
{
let mut hueco = buffer.buffer.lock().unwrap();
*hueco = i;
}
*is_space = false;
{ …Run Code Online (Sandbox Code Playgroud)