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

goo*_*goo 3 rust

示例代码:

fn main() {
    use std::thread::spawn;
    spawn(|| { loop { println!("a") } });
    // `a` is never printed
}
Run Code Online (Sandbox Code Playgroud)
fn main() {
    use std::thread::spawn;
    spawn(|| { loop { println!("a") } });
    loop { }
    // `a` is printed repeatedly
}
Run Code Online (Sandbox Code Playgroud)

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

She*_*ter 5

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

不.从文件中thread:spawn,强调我的:

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

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

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

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

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


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

fn main() {
    use std::thread;
    thread::spawn(|| loop {println!("a") });
}
Run Code Online (Sandbox Code Playgroud)