MST

星途 面试题库

面试题:Rust可变借用与通道(channel)在并发控制中的协同

在一个使用Rust编写的并发程序中,需要通过通道(channel)在不同线程间传递数据。假设发送端线程需要对共享数据进行可变借用并修改后发送给接收端,接收端接收到数据后不可变借用并处理。请阐述这种场景下如何避免借用冲突,同时说明如何利用Rust的所有权和借用机制来保证数据的安全传递和处理,并给出一个简单的代码实现。
12.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 避免借用冲突及利用所有权和借用机制
    • 在Rust中,所有权规则规定同一时间内,要么只能有一个可变借用(用于修改数据),要么可以有多个不可变借用(用于读取数据),但不能同时存在可变借用和不可变借用。
    • 为了在通道传递数据时避免借用冲突,当发送端线程对共享数据进行可变借用并修改后,需要将数据的所有权通过通道传递给接收端线程。这样,发送端在传递数据后不再拥有该数据的所有权,也就不存在借用冲突的问题。接收端接收到数据后,由于拥有了所有权,可以进行不可变借用(如果只是读取数据的话)来处理数据。
  2. 代码实现
use std::sync::mpsc;
use std::thread;

fn main() {
    let (tx, rx) = mpsc::channel();

    let mut data = String::from("initial data");

    let handle = thread::spawn(move || {
        // 发送端可变借用并修改数据
        data.push_str(" modified");
        // 将数据所有权通过通道发送
        tx.send(data).unwrap();
    });

    // 接收端接收数据并不可变借用处理
    let received_data = rx.recv().unwrap();
    println!("Received: {}", received_data);

    handle.join().unwrap();
}

在上述代码中:

  • 首先创建了一个通道 (tx, rx)
  • 发送端线程通过 thread::spawn 创建,并且使用 move 关键字将 data 的所有权转移到新线程中。在新线程中对 data 进行可变借用修改后,通过通道 txdata 发送出去。
  • 主线程作为接收端,通过 rx.recv() 接收数据,接收后 received_data 拥有数据所有权,这里进行不可变借用打印数据。同时等待发送端线程结束。