当你“生成”循环时会发生什么?

时间:2017-01-11 18:11:13

标签: rust

示例代码:

fn main() {
    use std::thread::spawn;
    spawn(|| { loop { println!("a") } });
    // `a` is never printed
}
fn main() {
    use std::thread::spawn;
    spawn(|| { loop { println!("a") } });
    loop { }
    // `a` is printed repeatedly
}
在第二种情况下,

a打印到标准输出,但在第一种情况下不一样。这是为什么?在第一种情况下,不应该a重复打印吗?

1 个答案:

答案 0 :(得分:5)

  

在第一种情况下,不应该a重复打印吗?

没有。从thread:spawn的文档中强调我的:

  

连接句柄将在被删除时隐式分离子线程。在这种情况下,子线程可能比父线程更长(除非父线程是主线程;整个进程在主线程完成时终止。)此外,连接句柄提供了一个连接方法,可以用来加入子线程。如果子线程发生混乱,join将返回一个包含恐慌参数的Err。

您的整个程序退出,因为主线程已退出。孩子线程从来没有机会开始,更不用说打印任何东西了。

在第二个示例中,您可以防止主线程退出,也会导致主线程永久旋转。

  

当你spawn循环时会发生什么?

只要程序执行,该线程就会在循环中旋转

在惯用法中,您不需要spawn中的额外花括号,而且只需导入std::thread然后调用thread::spawn就更为标准:

fn main() {
    use std::thread;
    thread::spawn(|| loop {println!("a") });
}