多线程访问导致崩溃一例

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

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

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

  简要流程: 

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

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

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

 

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

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

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

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

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

 

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

展开阅读全文

没有更多推荐了,返回首页