很早的时候就发现日志窗口异常崩溃的问题.当时也没在意,把日志窗口关闭就不会崩溃.
这几天需要更新日志窗口的部分功能, 不解决这个崩溃问题都不行了.
分析后发现这个BUG是因为vector <struct>引起的.
在push一个新数据时, 之前的老数据会free掉.
有一个这样的场景.
比如 vector 里面有一万条数据.
有一个 for 要遍历这一万条数据. 每循环一次,都浅拷贝出一份数据.
当遍历到一半的时候, 另外一个线程 又push了一个新数据.
那对于这个for 循环来说,
浅拷贝出来的数据可能已经free了, 那么这时候在操作,就是对已经free的内存操作.
那自然就会报错.
解决这个问题很简单,加个同步就好了.
我一般首选都喜欢用临界区.
但是在调试器这个例子上,我用了临界区没有效果.
又换了互斥也一样没有效果.
最后换了事件,问题解决.
了解了一下,原因大概是因为 临界区 和 互斥 在同一个线程中使用是无效的.
(一般也都是为了解决多线程同步才使用,我这个情况比较特殊,是在单线程中需要使用.)
而事件就不受线程影响, 单线程 多线程 都能使用.
至于信号和其它同步方法,我就没有测试了, 因为用事件解决问题就可以了.如果以后有时间,再来测测吧.
|