MST

星途 面试题库

面试题:Rust借用规则下的生命周期标注与数据竞争

在Rust中,假设你有一个函数,它接收两个引用作为参数,并且这两个引用指向的数据可能存在关联。请写出这个函数的签名,并详细说明如何正确标注生命周期,以确保在函数执行过程中不会出现数据竞争,同时解释为何这样标注。
20.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 函数签名
fn function_with_lifetimes<'a, 'b>(ref1: &'a i32, ref2: &'b i32) -> () {
    // 函数体
}

生命周期标注说明

  1. 'a'b:这两个是生命周期参数。它们代表了 ref1ref2 引用的生命周期。
  2. 为何这样标注
    • Rust 编译器需要明确知道引用的生命周期,以防止悬空引用和数据竞争。这里分别为两个引用标注不同的生命周期参数 'a'b,表示它们的生命周期可以相互独立。如果这两个引用指向的数据确实存在关联,并且生命周期相同,调用者在传入引用时,应该保证传入的引用具有相同的生命周期范围。例如:
    fn main() {
        let num1 = 10;
        let num2 = 20;
        function_with_lifetimes(&num1, &num2);
    }
    
    在这个例子中,num1num2 的生命周期从它们被声明开始,到 main 函数结束。当将 &num1&num2 传入 function_with_lifetimes 时,由于它们在 main 函数内的生命周期范围一致,满足函数对引用生命周期的要求。如果两个引用的生命周期不同,编译器会报错,因为这可能导致数据竞争或悬空引用等问题。