一个关于多线程同步问题的分析
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太多的问题了。
这里涉及到主线程的UI操作。很多人可能会考虑采用synchronize。但是,在我目前的程序中,主线程更多的工作是画图及数据生成的作业,特别是画图方面,不希望线程过于忙碌;也不希望子线程也一直卡在sychronize,而影响统计效率。
所以,这里采用子线程向主线程postmessage,告知统计进度。细心的人,可能会考虑,如果子线程中的统计数据量大,那么postmessage次数就多;线程队列则有可能爆满!
事实也确实这样,有一定的发生几率。采用此法后,软件有时会出现“假死”现象,只要点击一下任务栏的程序按钮,“假死”状态就消失了;甚至有时根本无法响应;CPU使用率一直高居不下,只能通过任务管理器“杀死”。
通过比较程序前后表现及过程中所做的事情,确定是postmessage过于频繁。
那么解决办法也就是减少postmessage次数——只有当message被处理完了,才post。这里我们可以通过设置某标志,来判断。设置一个boolean变量可以吗?要知道,这是在多线程环境中,仅仅这样设置全局变量,存在“信息反馈不及时”的问题。这里,我们可以引入API:InterLockedExchange和InterLockedIncrement。这两个API都是原子操作,不必担心“信息反馈不及时”的问题(具体用法参考MSDN)。
按以上做法,就可以解决message太多的问题了。
相关文章推荐
- 关于一个在Intellij Idea中打包正常,tomcat启动也正常,但在浏览器中访问出404的问题的原因分析
- 关于Blocked Process Report 一个让人迷惑的问题分析
- 关于ViewPager滑动广告栏所出的问题和布局分析,做一个结果。。。
- 一个关于时间的故事(通过历史分析解决程序问题)
- 一个关于javascript匿名函数的问题分析
- 一个关于时间的故事(通过历史分析解决程序问题)
- 关于一个心理问题的分析
- 信息异步处理,关于handle和thread交互信息,只能更改一个textview的问题原因分析
- 一个关于时间的故事(通过历史分析解决程序问题)
- 一个关于javascript匿名函数的问题分析
- 关于S5PV210的启动问题和u-boot分析并自己实现一个简单的boot(一)
- 一个关于applet访问硬件的问题??
- VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
- 今天在看一些面试题的时候遇到的一个关于strcmp()返回值的细节问题
- 一个实际问题分析及解决之九:什么是应用服务器
- [唠叨两句]一个关于OpenFileDialog 影响 相对路径的问题
- 一个关于unity3d中ios设备多点触控顺序的问题
- MapReduce项目中的一个JVM错误问题分析和解决
- 关于include标签导致js路径找不到的问题分析及解决
- 从数据分析中,发现PHP浮点数的一个常见问题