注册

CpuDbg x96

查看: 968|回复: 0
收起左侧

[CpuDbg x96] vector free 导致调试器日志窗口崩溃,临界区互斥同步失效问题

[复制链接]
发表于 2022-6-3 07:13:23 | 显示全部楼层 |阅读模式
很早的时候就发现日志窗口异常崩溃的问题.当时也没在意,把日志窗口关闭就不会崩溃.
这几天需要更新日志窗口的部分功能, 不解决这个崩溃问题都不行了.

分析后发现这个BUG是因为vector <struct>引起的.
在push一个新数据时, 之前的老数据会free掉.

有一个这样的场景.
比如 vector 里面有一万条数据.
有一个 for 要遍历这一万条数据. 每循环一次,都浅拷贝出一份数据.
当遍历到一半的时候, 另外一个线程 又push了一个新数据.
那对于这个for 循环来说,
浅拷贝出来的数据可能已经free了, 那么这时候在操作,就是对已经free的内存操作.
那自然就会报错.

解决这个问题很简单,加个同步就好了.
我一般首选都喜欢用临界区.
但是在调试器这个例子上,我用了临界区没有效果.
又换了互斥也一样没有效果.
最后换了事件,问题解决.

了解了一下,原因大概是因为 临界区 和 互斥 在同一个线程中使用是无效的.
(一般也都是为了解决多线程同步才使用,我这个情况比较特殊,是在单线程中需要使用.)
而事件就不受线程影响, 单线程 多线程 都能使用.

至于信号和其它同步方法,我就没有测试了, 因为用事件解决问题就可以了.如果以后有时间,再来测测吧.
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注册

QQ|Archiver|手机版| CpuDbg x96

GMT, 2024-5-18 17:53 , Processed in 0.062500 second(s), 16 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表