视频地址
头条地址:https://www.ixigua.com/i6775861706447913485
B站地址:https://www.bilibili.com/video/av81202308/
源码地址
github地址:https://github.com/anonymousGiga/learn_rust
讲解内容
线程与move闭包
(1)错误例子:
use std::thread;
fn main() {
let v = vec![1, 2, 3];
let handle = thread::spawn(|| {
println!("Here's a vector: {:?}", v);
});
handle.join().unwrap();
}
报错原因:Rust 不知道这个新建线程会执行多久,所以无法知晓 v 的引用是否一直有效。
补充说明,如下例子:
use std::thread;
fn main() {
let v = vec![1, 2, 3];
let handle = thread::spawn(|| {
println!("Here's a vector: {:?}", v);
});
drop(v); // 错误:子线程可能还在运行,在使用v,但是此处已经将v drop掉了
handle.join().unwrap();
}
(2)正确方法,使用move:
use std::thread;
fn main() {
let v = vec![1, 2, 3];
let handle = thread::spawn(move || {
println!("Here's a vector: {:?}", v);
});
handle.join().unwrap();
}
通过move,将v的所有权就移到子线程中了,主线程将不再使用v。
如下,错误例子:
use std::thread;
fn main() {
let v = vec![1, 2, 3];
let handle = thread::spawn(move || {
println!("Here's a vector: {:?}", v);
});
drop(v); //错误,v已经被移动到子线程中了
handle.join().unwrap();
}