示例代码:
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在第一种情况下不应重复打印?
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)
| 归档时间: |
|
| 查看次数: |
529 次 |
| 最近记录: |