您的位置:首页 > 其它

一个关于多线程同步问题的分析

2011-12-23 15:26 267 查看
设有 主线程M_T,子线程:S_T1、S_T2、S_T3。子线程的任务是执行数据统计,并将统计进度反馈给主线程。

这里涉及到主线程的UI操作。很多人可能会考虑采用synchronize。但是,在我目前的程序中,主线程更多的工作是画图及数据生成的作业,特别是画图方面,不希望线程过于忙碌;也不希望子线程也一直卡在sychronize,而影响统计效率。

所以,这里采用子线程向主线程postmessage,告知统计进度。细心的人,可能会考虑,如果子线程中的统计数据量大,那么postmessage次数就多;线程队列则有可能爆满!

事实也确实这样,有一定的发生几率。采用此法后,软件有时会出现“假死”现象,只要点击一下任务栏的程序按钮,“假死”状态就消失了;甚至有时根本无法响应;CPU使用率一直高居不下,只能通过任务管理器“杀死”。

通过比较程序前后表现及过程中所做的事情,确定是postmessage过于频繁。

那么解决办法也就是减少postmessage次数——只有当message被处理完了,才post。这里我们可以通过设置某标志,来判断。设置一个boolean变量可以吗?要知道,这是在多线程环境中,仅仅这样设置全局变量,存在“信息反馈不及时”的问题。这里,我们可以引入API:InterLockedExchange和InterLockedIncrement。这两个API都是原子操作,不必担心“信息反馈不及时”的问题(具体用法参考MSDN)。

按以上做法,就可以解决message太多的问题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: