You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 = &current + 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:58:21