多线程访问导致崩溃一例

本文详细分析了一位开发者在整合同事功能时遇到的系统崩溃问题,特别是缓冲区为空导致的错误。通过深入排查,发现了多线程环境下对象管理和内存释放的几个关键误区,并提出了有效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  开发的系统,过一会就嗝屁。这怎么查?

  昨天整合同事的功能,结果一跑就崩溃。查下来是传递的缓冲区为空,确认了一下调用之前也确实是空。可是吾代码有专门的线程锁,执行之后才释放,怎么是空呢?被谁释放了?

  今天赶到公司,认真查了半天。经过分析,找到了出错原因。总结如下:

  简要流程: 

  线程1构建一个源对象1,把数据复制在缓冲区中;

  新建对象2,保存对象1的所有信息,将对象2加入到队列1;

  线程2将队列1复制到队列2,然后执行。

 

  听起来没什么破绽,有几个坑:

  1、复制的源对象,不能跟其他代码共用。

  2、队列1的对象(含缓冲区)要自行建立,不能与源相同。否则源一释放就完蛋了。

  3、队列2的对象,不能使用队列1的对象(指针),必须是自己建立。否则在线程1修改对象时,线程2访问,必然出错。缓冲区可以使用共用,因为线程1新建后放入队列,没有其他使用方。

  4、线程2注意正确释放缓冲区内存。

 

  现在就很稳定了。只是CUDA的内存释放还有问题,不过这个目前管不了。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳鲲鹏

能给阁下一点帮助,非常荣幸

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值