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