小编Adr*_*lle的帖子

使用 Mutex 和 Condvar 在 Rust 中缓冲

我正在尝试使用单个消费者和单个生产者实现缓冲区。我只使用了 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)

concurrency multithreading mutex condition-variable rust

1
推荐指数
1
解决办法
982
查看次数