注册 登录
编程论坛 VC++/MFC

忙碌线程最多有几个

邵帅 发布于 2014-08-28 11:01, 2217 次点击
在完成端口解决socket通讯多线程时,提出开启的线程个数最好为cpu个数的两倍以达到最高效率。
我现在想实现线程池,即最多只能有4个工作线程,对任务进行排队处理。发现当有4个忙碌任务时会造成界面很卡,抛开线程池而仅仅开启4个忙碌线程发现结果一样。
如果4个工作线程+1个界面主线程的优先级相等,当4个工作线程完全占用分给他们的CPU时间片,操作系统也会强制将控制权转给主线程,对于5个线程而言不应该会卡吧?
求解释。
9 回复
#2
天使梦魔2014-08-28 11:30
线程又不分优先级,你应该看下windows核心编程的关于线程那部分.
线程操作属于抢占式,你可以自己写个16位程序测试下,每个线程用一个死循环不停的输出,最后输出界面不是理想中按CPU分配来顺序输出的,而是毫无头绪的输出,哪个线程执行的快,哪个就抢占的多,即便是一模一样的代码,也有很细微的分别.

线程会不会卡,取决于你的代码质量和设计思路,只要主线程没挂掉,子线程就可以正常执行,就像一个独立的程序.
子线程工作情况取决于你对消息泵如何设计的,你必须很详细的了解windows工作原理才行.打个比方,我以前也做过的一个,子线程用于定时器工作,但消息循环没有设计好,timer一直不得到执行,看了msdn才知道消息循环里timer属于很低的优先级,假如其它消息过于繁重可能直接强行抢占timer消息(按顺序往下直接跳过低优先级),导致函数失效.这不是线程卡不卡的问题,最后只能通过线程独立设置一个消息循环用于定时器.

我不知道你在设计什么,不过你最好对自己的东西很了解
#3
天使梦魔2014-08-28 11:40
而且给你个提议,当线程处于待机状态时候,你最好暂停线程,一个线程即便什么也不做,如果不暂停,仅仅本身的消息循环就能让cpu占用率高达100%(双核50%以此类推) ,虽然不影响其它程序,但效率被占用了.
#4
邵帅2014-08-30 09:53
回复 3 楼 天使梦魔
多谢指导。
我只是疑问,如果线程函数是死循环,这样的工作线程最多跑几个才不会使主线程产生卡顿现象。
#5
tlliqi2014-08-30 10:38
回复 2 楼 天使梦魔
很不错
#6
yuccn2014-08-30 23:59
四个线程 如果不是死循环,不足以卡住界面,比如qq这样的进程,至少有10几个线程在跑。如果每个线程都很忙碌,比如死循环做某些任务,则记得sleep一下,
#7
邵帅2014-08-31 20:03
回复 6 楼 yuccn
那有确切的数量吗?比如cpu的1倍或者2倍
#8
yuccn2014-09-01 12:27
回复 7 楼 邵帅
可以通过工具看到的。
进程的线程数,打开对象句柄,等等都可以通过工具看到,比如可以试试prohark
#9
yuccn2014-09-01 12:29
回复 7 楼 邵帅
没有确切的,一般都是不同任务在不同线程吧,不过qq的socket 监听,不会比你写的工程的需求少吧
#10
邵帅2014-09-01 22:42
多谢各位。
1