面试题答案
一键面试在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();
}
在上述代码中:
- 我们定义了
Data
结构体。 - 在
main
函数中,创建了Data
实例data
。 - 使用
thread::spawn
创建新线程,并在闭包前加上move
关键字,这会将data
的所有权移动到闭包中。 - 新线程可以安全地使用
data
。而主线程中由于所有权已经转移,不能再访问data
,从而避免了所有权相关的错误。