頭條地址: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 協議》,轉載必須註明作者和本文連結