Rust 学习笔记:关于 Thread 的练习题
Rust 学习笔记:关于 Thread 的练习题
参考视频:
- https://www.bilibili.com/video/BV1z3XGYBE8F
问题一
以下程序能否通过编译?若能,输出是?
use std::thread;
fn main() {
let mut n = 1;
let t = thread::spawn(move || {
n = n + 1;
thread::spawn(move || {
n = n + 1;
})
});
n = n + 1;
t.join().unwrap().join().unwrap();
println!("{}", n);
}
答:可以通过编译。输出 2。
变量 n是 i32 类型数据,实现了 Copy trait,创建子线程 move 转移所有权,实际是把 n 拷贝了一份传递进子线程,主线程的变量 n 不受子线程内操作影响,所以最后打印主线程中的 n 值还是等于 2。
问题二
考虑以下代码:
use std::thread;
fn main() {
let v = vec![1, 2, 3];
let handle = thread::spawn(|| {
println!("Here's a vector: {v:?}");
});
handle.join().unwrap();
}
报错:
以下哪项最好地描述了 function requires argument type to outlive `'static` 注释?
A. Rust 不知道线程会运行多久,因此线程捕获的值必须永远存活
B. 闭包只能捕获类型为 &'static str 的字符串常量
C. Vector v包含的值不能比 'static 活得更久
D. 传递给 thread::spawn 的闭包不允许接受任何参数
答:A。