多线程问题,百分求解?

spdia 2001-06-30 12:08:30
我用mfc作了一个进程外自动化对象,接口中包含两个方法。其中一个方法启动最多四个线程用于读数据库(每个线程上一个数据库连接),启动线程后立即返回。另一个方法用于检测那个线程完成并取得记录。我发现这样一个问题,哪怕只启动一个线程去读数据库当数据库记录数超过1500时,大量cpu时间被此进程外组件占用,理论上说每个线程的时间片只有20ms,为什么会占用这么多cpu时间被占用导致其他程序停滞,请大家踊跃提出意见,我会继续加分。
...全文
198 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
WhiteWaterBlueSky 2001-07-05
  • 打赏
  • 举报
回复
我同意plato(天天)的想法!
mywave 2001-07-05
  • 打赏
  • 举报
回复
只要在循环里用个Sleep(XX)肯定能把你CPU占有率降很多
试试吧
plato 2001-07-05
  • 打赏
  • 举报
回复
肯定是用了循环的问题,我可以打赌,赌1000分。
leky2000 2001-07-05
  • 打赏
  • 举报
回复
可能是执行线程是进行的线程调度不对,导致系统内部进行线程优先级的自动调整,也就是有线程总处于渴望状态,系统一直在提高他的优先级,关闭自动调整功能,检查一下
xlqin 2001-07-05
  • 打赏
  • 举报
回复
你在线程内不要用完全的死循环,可以用Sleep(1)主动交出CPU,而不依赖于20ms的时间片!
plato 2001-07-05
  • 打赏
  • 举报
回复
办法1:WaitForMultiObject可以等待多个线程结束。

办法2:或者用一个信号量,初始值为0。每个工作线程退出时调用ReleaseSemaphore。
而监视线程调用WaitForSingleObject( semaphore)来等待。

plato 2001-07-05
  • 打赏
  • 举报
回复
你那个检查的线程怎么做的?是不是设了一个标志,类似:
while( bEndFlag)
{
}
如果这样,会消耗大量的CPU。

建议可以改成线程间同步机制。
Kevin_qing 2001-07-05
  • 打赏
  • 举报
回复
正常情况。
你应该是在nt/2000下面运行的吧,要是觉得占用cpu太多,可以降低优先级试试。
spdia 2001-07-05
  • 打赏
  • 举报
回复
请各位多提意见,如能解决问题,我会继续加分.
捕鲸叉 2001-07-05
  • 打赏
  • 举报
回复
能把例程发给我吗?我给你看看

joshua0137@sina.com
xxxbird 2001-07-05
  • 打赏
  • 举报
回复
Sorry, 我说错了。
>> 98/Me是非抢先式OS
我写错了,是抢先式。

Jazzlover 2001-07-05
  • 打赏
  • 举报
回复
to xxxbird(*说你行,你就行,不行也行*):
怎么可能?
zheng_rui 2001-07-05
  • 打赏
  • 举报
回复
Sleep()
Sleep()
Sleep()
Sleep()
Sleep()
Sleep()
Sleep()
Sleep()
Sleep()
Sleep()
Sleep()
Sleep()
lianhuiyong 2001-07-05
  • 打赏
  • 举报
回复
我觉得应该是操作系统在处理消息队列时产生的问题,启动线程后,此进程对于操作系统来说处于OnIdle()状态,而在MFC中使用的获取消息队列的是GetMessage(),应该换成PeekMessage()。这两个函数在处理OnIdle()过程时,对操作系统来说,有很大的区别。
lianhuiyong 2001-07-05
  • 打赏
  • 举报
回复
应该先给分配一个临界区EnterCriticalSection()
leky2000 2001-07-05
  • 打赏
  • 举报
回复
Sleep(XX)会让出线程得时间
spdia 2001-07-02
  • 打赏
  • 举报
回复
是NT,是与别的应用程序竞争时发生死锁吗?
98是抢先式OS,GetMessage()能交出控制权,但DispatchMessage()时可能会不交出控制权,
导致其他程序有问题。
xxxbird 2001-07-01
  • 打赏
  • 举报
回复
你用的是98么?98/Me是非抢先式OS,一个进程/线程只要它自己不交出控制权,别的进程/线程是抢不过去的。
如果用的是NT,则可能产生了死锁。
spdia 2001-07-01
  • 打赏
  • 举报
回复
一个线程也能死锁
wyzegg 2001-06-30
  • 打赏
  • 举报
回复
肯定是死锁啦

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧