为何Rust中thread创建的线程内print语句无法执行?
为什么Rust中
thread::spawn创建的子线程无输出? 核心原因很直接:主线程结束时,整个进程会立即退出,所有子线程会被操作系统强制终止,不管它们有没有完成任务。
你的代码里,主线程执行完自身的println语句后就立刻结束了,而子线程可能还没被操作系统调度执行,或者刚启动就被终止——哪怕你在子线程里写了20条println,也没机会输出。
和系统无关
这个现象和Kali Linux没关系,所有遵循POSIX标准的操作系统(包括Linux、macOS)以及Windows,都会在进程的主线程结束时直接终止整个进程,子线程无法独立存活。你增加print语句的操作也没用,因为主线程执行完这些语句的速度远快于操作系统调度子线程的时间差。
为什么join或sleep能解决?
join方法:调用子线程的join会让主线程阻塞,直到子线程完全执行完毕才继续。这样子线程有足够的时间跑完所有代码,输出自然能正常显示。thread::sleep:让主线程暂停一段时间,这段时间内操作系统有机会调度子线程执行。但这是不可靠的测试手段——你无法预知子线程需要多久执行完,sleep时长太短还是会导致子线程被终止,太长又浪费时间。
修正后的示例代码(用join)
use std::thread; fn main() { // 保存子线程的句柄 let thread_handle = thread::spawn(|| { println!("Hello 1, world thread!"); println!("Hello 2, world thread!"); println!("Hello 3, world thread!"); }); println!("Hello 1, world main function!"); println!("Hello 2, world main function!"); // 等待子线程执行完成,unwrap处理可能的线程panic thread_handle.join().unwrap(); }
内容的提问来源于stack exchange,提问作者Yilmaz
相关产品推荐
相关产品推荐

