Rust 程式設計視訊教程(進階)——016_3 執行緒與 move 閉包

linghuyichong發表於2020-02-05

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

令狐一衝

相關文章