2017-01-11 119 views
3

示例代码:当你产生一个循环时会发生什么?

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

注意:您忽略的返回值'的螺纹:: spawn',如果你使用它,你可以查询线程是否已完成,或等待其完成(这可能需要一段时间的无限循环)。 –

回答

5

不应该在第一种情况下反复打印a

号从文档从thread:spawn,重点煤矿:

的加入手柄在被丢弃将隐式分离的子线程。在这种情况下,子线程可以活得比父(除非父线程是主线程;当主线程完成的整个过程被终止。)此外,加入手柄提供了一种连接方法,可用于加入子线程。如果子线程发生混乱,join将返回一个包含给panic的参数的Err。

整个程序退出,因为主线程已退出。甚至没有机会启动子线程,更不用说打印任何东西。

在第二个例子中,可以防止主线程从同时造成,要永远自旋退出。

当你spawn一个循环会发生什么?

只要程序执行,该线程将循环旋转,


惯用,你不需要在spawn额外的花括号,这是更标准只导入std::thread,然后调用thread::spawn

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

在发布此问题之前,我以粗体读取了该部分,但对我而言并不那么清楚。我现在很清楚。谢谢。 – goo

相关问题