Rust 编程视频教程(进阶)——016_3 线程与 move 闭包

视频地址

头条地址: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();
}
发布了132 篇原创文章 · 获赞 135 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/lcloveyou/article/details/104290756
今日推荐