MST

星途 面试题库

面试题:Rust中借用规则如何防止数据竞争

请详细阐述Rust借用规则的具体内容,以及通过这些规则是怎样避免数据竞争的,可结合简单代码示例说明。
17.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

Rust借用规则具体内容

  1. 同一时间内,特定数据的可变借用只能有一个:这意味着不能在同一作用域内同时有多个可变引用指向同一数据。例如:
fn main() {
    let mut num = 5;
    let r1 = &mut num;
    // 下面这行代码会报错,因为已经有一个可变引用r1
    // let r2 = &mut num; 
    *r1 = 6;
    println!("{}", num);
}
  1. 同一时间内,可以有多个不可变借用,但不能有可变借用:即可以有多个只读引用同时存在,但不能在有只读引用时存在可变引用。例如:
fn main() {
    let num = 5;
    let r1 = #
    let r2 = #
    println!("r1: {}, r2: {}", r1, r2);
    // 下面这行代码会报错,因为已有不可变引用r1和r2
    // let r3 = &mut num; 
}
  1. 借用的生命周期必须小于等于被借用数据的生命周期:借用不能超过其所借用数据的存在时间。例如:
fn main() {
    let result;
    {
        let num = 5;
        // 这里result的生命周期期望长于num,会报错
        // result = # 
    }
    // println!("{}", result);
}

如何避免数据竞争

  1. 防止写 - 写竞争:由于同一时间只能有一个可变借用,就避免了多个地方同时尝试修改同一数据的情况。如果有两个可变引用同时修改数据,就会出现数据竞争问题。而Rust的规则强制同一时刻只有一个可变引用能修改数据,例如上述第一个例子,如果允许同时有 r1r2 两个可变引用,它们同时修改 num,就会导致数据竞争,Rust通过规则避免了这种情况。
  2. 防止读 - 写竞争:当存在不可变借用(读)时,不允许可变借用(写),这样就避免了在读取数据时数据被修改的情况。例如在第二个例子中,如果允许在有 r1r2 不可变引用(读操作)时创建 r3 可变引用(写操作),那么读操作可能会读到不一致的数据,Rust通过规则避免了这种读 - 写竞争。