Conner 的个人资料☆ Conner Wang ☆照片日志列表更多 工具 帮助

日志


10月2日

多处理器环境下不出错而单处理器环境下却出错的多线程程序

多线程程序比单线程程序要考虑的东西要多的多,如临界区、竞争、死锁、资源的维护等等。今天我写程序的时候就犯了一个低级的错误,从而导致我的程序在多CPU环境下可以运行而在单CPU环境下却出问题。

程序是用VC写的,共有两个线程:一个是GUI线程,一个是数据处理线程。处理线程会产生日志信息,日志信息会经过两种方式被处理:1. 通过发消息从而在GUI界面里增量显示;2. 在处理线程中将日志信息增量写入日志文件。

我的日志信息是一个CString,它是在堆里动态分配的。我最初的程序是将日志信息的地址发给GUI线程,GUI线程显示完毕后释放这部分内存。后来我又加上了日志写入文件这一功能,就是日志信息在GUI界面显示完毕后还会在处理进程中写入日志文件。

由于我的开发环境是多核环境,一开始并没有什么问题,但当我将程序运行在单核机器上时,有时会出问题,说是某个引用的地址0x00000000无效。经过调试我才发现问题出在内存释放这一部分:在我的多核系统中,日志信息在两个线程中同时被使用,由于GUI进程处理的稍慢,所以当它释放内存时,处理进程已经使用完,所以不出错;而在单核系统中,同时只有一个进程在运行,如果写入日志文件的操作晚于GUI线程释放内存的操作,则系统会出现问题。

找到了问题的根源所在,修改就很简单了,方案有两种:
1. 将日志信息先在处理进程中写入文件,然后再发消息给GUI进程来显示
2. 将日志信息统一在GUI进程处理(显示并写入日志)

教训:
通常多线程程序在单CPU系统中不容易出现问题而在多CPU系统中才出现问题,但并不总是如此,我这就是一个例子。