rust - 如何在 Rust 中正确改变互斥体后面的向量

标签 rust mutex

我有一个看起来像这样的结构:

pub struct Coordinator {
    map_tasks: Mutex<Vec<Task>>,
    reduce_tasks: Mutex<Vec<Task>>,
}

我有一个使用参数调用的函数,以确定要修改两个向量中的哪一个。该函数采用类型和 id 在向量中查找并修改。我原来的做法是这样的:

impl Coordinator {
    pub fn update_status(&self, task_type: TaskType, task_id: u8) {
        if task_type == TaskType::Map {
            let tasks = &mut self.map_tasks.lock().unwrap();
            for task in tasks.iter_mut() {
                if task.task_id == task_id {
                    task.status = TaskStatus::Success;
                }
            }
        } else {
            let tasks = &mut self.reduce_tasks.lock().unwrap();
            for task in tasks.iter_mut() {
                if task.task_id == task_id {
                    task.status = TaskStatus::Success;
                }
            }
        }
    }
}

我想缩短代码,因为其中很多都是重复的。我已经尝试过这个,但它不适用于错误借用时临时值被丢弃,请考虑使用“let”绑定(bind)来创建生命周期更长的值

impl Coordinator {
    pub fn update_status(&self, task_type: TaskType, task_id: u8) {
        let tasks;
        if task_type == TaskType::Map {
            tasks = &mut self.map_tasks.lock().unwrap();
        } else {
            tasks = &mut self.reduce_tasks.lock().unwrap();
        }

        for task in tasks.iter_mut() {
            if task.task_id == task_id {
                task.status = TaskStatus::Success;
            }
        }
    }
}

我该如何解决这个问题?

最佳答案

您不需要将可变引用放入守卫中,您可以直接存储守卫。另外,if..else 是一个表达式,您可以将其用作三元:

impl Coordinator {
    pub fn update_status(&self, task_type: TaskType, task_id: u8) {
        let mut tasks = if task_type == TaskType::Map {
            self.map_tasks.lock().unwrap()
        } else {
            self.reduce_tasks.lock().unwrap()
        };

        for task in tasks.iter_mut() {
            if task.task_id == task_id {
                task.status = TaskStatus::Success;
            }
        }
    }
}

关于rust - 如何在 Rust 中正确改变互斥体后面的向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75414372/

相关文章:

pthreads - 我可以在线程特定数据的析构函数中使用 pthread 互斥锁吗?

c - 向等待锁的线程发出信号,表明该锁已变得无关紧要

winapi - "machine sleep"+ WaitForSingleObject + 有限超时

c - 为什么从C调用Rust库会导致内存泄漏?

optimization - Rust 优化输出循环?

rust - Rust 中的冒号运算符与 C 中的冒号运算符有何相似之处?

mongodb - 如果在Rust中使用skip_serialize serde属性,则无法将字段写入MongoDB文档

c - 生产者-消费者队列中出现奇怪的死锁

c++ - 事件队列和互斥锁

docker - 无法部署到 docker - 加密失败并且找不到 Rust 编译器