示例代码:
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
在第一种情况下不应重复打印?
a
在第一种情况下不应重复打印?
不.从文件中thread:spawn
,强调我的:
连接句柄将在被删除时隐式分离子线程.在这种情况下,子线程可能比父线程更长(除非父线程是主线程;当主线程完成时,整个过程终止.)此外,连接句柄提供了一个可用于加入子线程的连接方法线.如果子线程发生混乱,join将返回一个包含恐慌参数的Err.
您的整个程序退出,因为主线程已退出.孩子线程从来没有机会开始,更不用说打印任何东西了.
在第二个示例中,您可以防止主线程退出,也会导致主线程永久旋转.
当你
spawn
循环时会发生什么?
只要程序执行,该线程就会在循环中旋转.
在惯用法中,您不需要额外的花括号spawn
,而且只需要导入std::thread
然后调用它就更标准thread::spawn
:
fn main() { use std::thread; thread::spawn(|| loop {println!("a") }); }