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

有界缓冲区生产者消费者范式下内存泄漏与死循环问题排查

问题分析

死循环/卡死核心原因

  • 多生产者终止逻辑错误:你采用的是多生产者模式,每个生产者运行结束都会插入一个-1作为结束标记,但消费者只要读到第一个-1就直接退出了。剩下的生产者还在往环缓冲区写入数据,当缓冲区被占满后,生产者会卡在rb_insert的条件等待位置,永远等不到已经退出的消费者来消费唤醒。而主线程先join消费者之后,又在join永远不会结束的生产者线程,所以整个程序完全卡死,只能用ctrl-c终止。修复这个问题可以在全局维护一个生产者退出的原子计数器,消费者每收到一个-1就给计数器加1,只有计数器值等于生产者总数量时,消费者才退出循环。
  • 补充检查项:确认rb_insert和rb_remove的条件变量唤醒逻辑是否正确,比如写入数据后是否正确唤醒消费者、读取数据后是否正确唤醒生产者,是否存在信号丢失的问题。

内存泄漏原因

  • 你看到的Valgrind泄漏报告都是程序被ctrl-c强制终止导致的:正常的清理逻辑(rb_finalize释放环缓冲、线程资源回收、文件关闭)都没有执行到,所以会出现还可达的内存记录,不是代码本身的逻辑泄漏。其中272字节的可能丢失是pthread_create分配的线程TLS内存,线程没正常退出所以没有被系统回收,解决卡死问题让程序正常退出后,这些泄漏记录都会消失。

其他潜在问题

  • rb_init函数存在逻辑漏洞:如果rb->buf的malloc失败,前面已经分配的struct ringbuf_t结构体没有释放,会造成真正的内存泄漏。
  • producer函数中fopen没有做错误校验,如果输入文件不存在/无权限打开,后续fgetc操作会直接触发未定义行为。
  • 消费者代码中注释掉了fclose(outputFile),正常退出时也会泄漏文件句柄对应的资源。

内容的提问来源于stack exchange,提问作者Pochetes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:45:10