Rust多线程斐波那契程序出现Killed崩溃问题求助
问题分析与解决方案
你的程序崩溃输出Killed,本质是内存耗尽被系统强制终止,核心原因如下:
- 生产者线程在无限循环中快速生成斐波那契数并发送到无界的
mpsc::channel,而消费者线程的打印速度远慢于生产速度 - 通道会持续堆积大量
rug::Integer对象(斐波那契数会随序列增长呈指数级膨胀,占用内存也急剧增加),最终耗尽系统内存,触发OOM Killer
虽然dstat --top-oom未捕捉到,但这是因为OOM Killer的触发日志可能未被该工具实时捕获,内存溢出仍是问题根源。
修复方案
使用带缓冲区限制的sync_channel替代无界的mpsc::channel,当缓冲区满时,生产者线程会自动阻塞,等待消费者处理完已有数据后再继续生产,从根源避免内存堆积。
修改后的代码:
use rug::Integer; use std::sync::mpsc; use std::thread; struct FibSequ { curr: Integer, next: Integer } impl Default for FibSequ { fn default() -> Self { Self {curr: Integer::from(0), next: Integer::from(1)} } } impl Iterator for FibSequ { type Item = Integer; fn next(&mut self) -> Option<Self::Item> { let current = self.curr.clone(); self.curr = self.next.clone(); self.next = ¤t + self.next.clone(); Some(current) } } fn main() { // 创建最多容纳10个元素的有界通道,可根据实际场景调整缓冲区大小 let (tx, rx) = mpsc::sync_channel(10); thread::spawn(move || { let mut fib = FibSequ::default(); loop { // 缓冲区满时自动阻塞,直到消费者取走数据 tx.send(fib.next().unwrap()).unwrap(); } }); for i in rx { println!("{}", i); } }
关键修改说明
mpsc::sync_channel(10):创建有界通道,限制缓冲区最多容纳10个元素- 当通道已满时,
tx.send()会阻塞生产者线程,强制生产速度与消费速度匹配,彻底避免无限制的内存堆积
内容的提问来源于stack exchange,提问作者inyourface3445
相关产品推荐
相关产品推荐

