面试题答案
一键面试不可变引用和可变引用规则
- 不可变引用规则:
- 可以有多个不可变引用同时存在。这允许在不修改数据的情况下,从多个地方读取数据。
- 可变引用规则:
- 在任何给定时间,只能有一个可变引用。这确保了在修改数据时,不会有其他引用同时尝试访问或修改同一数据。
- 可变引用和不可变引用不能同时存在。即要么有多个不可变引用,要么有一个可变引用,但不能同时存在这两种引用。
防止数据竞争确保数据安全性
- 数据竞争条件:当多个线程同时访问同一数据,并且至少有一个线程在写数据时,就会发生数据竞争,导致未定义行为。
- Rust规则防止数据竞争方式:
- 通过限制可变引用的唯一性,Rust确保在任何时刻只有一个引用可以修改数据,避免了多个写操作或者读写操作同时进行的情况,从而防止数据竞争。
违反规则代码示例及错误
fn main() {
let mut num = 5;
let r1 = # // 不可变引用
let r2 = # // 另一个不可变引用,合法
let r3 = &mut num; // 错误:因为已经存在不可变引用r1和r2,不能同时有可变引用
println!("r1: {}, r2: {}", r1, r2);
println!("r3: {}", r3);
}
上述代码在let r3 = &mut num;
处会报错,编译器给出的错误类似:
error[E0502]: cannot borrow `num` as mutable because it is also borrowed as immutable
--> src/main.rs:5:13
|
3 | let r1 = #
| ---- immutable borrow occurs here
4 | let r2 = #
| ---- immutable borrow occurs here
5 | let r3 = &mut num;
| ^^^^^^^^ mutable borrow occurs here
6 | println!("r1: {}, r2: {}", r1, r2);
| -- immutable borrow later used here
此错误明确指出因为已经存在不可变引用r1
和r2
,所以不能对num
进行可变借用。这体现了Rust编译器对引用规则的严格检查,从而防止数据竞争。