面试题答案
一键面试- 避免借用冲突及利用所有权和借用机制:
- 在Rust中,所有权规则规定同一时间内,要么只能有一个可变借用(用于修改数据),要么可以有多个不可变借用(用于读取数据),但不能同时存在可变借用和不可变借用。
- 为了在通道传递数据时避免借用冲突,当发送端线程对共享数据进行可变借用并修改后,需要将数据的所有权通过通道传递给接收端线程。这样,发送端在传递数据后不再拥有该数据的所有权,也就不存在借用冲突的问题。接收端接收到数据后,由于拥有了所有权,可以进行不可变借用(如果只是读取数据的话)来处理数据。
- 代码实现:
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
进行可变借用修改后,通过通道tx
将data
发送出去。 - 主线程作为接收端,通过
rx.recv()
接收数据,接收后received_data
拥有数据所有权,这里进行不可变借用打印数据。同时等待发送端线程结束。