MST

星途 面试题库

面试题:Rust移动语义在并发编程中的基础应用

在Rust并发编程场景下,假设有一个结构体`Data { value: i32 }`,现在要通过`std::thread::spawn`创建新线程并传递`Data`实例。请解释如何利用移动语义确保数据安全传递,同时避免所有权相关的错误,并给出代码示例。
28.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

在Rust中,利用移动语义传递数据给新线程是很直接的。由于std::thread::spawn的闭包会获取其捕获变量的所有权,我们可以直接将Data实例传递到闭包中,Rust会自动处理所有权转移。

use std::thread;

struct Data {
    value: i32,
}

fn main() {
    let data = Data { value: 42 };

    let handle = thread::spawn(move || {
        // 这里`data`的所有权被转移到了新线程中
        println!("Thread got data with value: {}", data.value);
    });

    // 这里不能再访问`data`,因为所有权已经转移
    // println!("Main thread: {}", data.value); // 这行会编译错误

    handle.join().unwrap();
}

在上述代码中:

  1. 我们定义了Data结构体。
  2. main函数中,创建了Data实例data
  3. 使用thread::spawn创建新线程,并在闭包前加上move关键字,这会将data的所有权移动到闭包中。
  4. 新线程可以安全地使用data。而主线程中由于所有权已经转移,不能再访问data,从而避免了所有权相关的错误。