Rust 编程视频教程(进阶)——016_3 线程与 move 闭包
视频地址
头条地址:https://www.ixigua.com/i677586170644791348...
B站地址:https://www.bilibili.com/video/av81202308/
源码地址
github地址:https://github.com/anonymousGiga/learn_rus...
讲解内容
线程与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();
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: