看你说的阻塞指的是什么,如果是死循环,当然占CPU,如果是用等待同步事件,会让出CPU
碧水蓝天 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-5-25 14:34:56 Top
如果线程函数结构如下:
DWORD ThreadFun(LPVOID para)
{
while(1)
{
阻塞语句;//执行到此处阻塞时,线程会不会让出CPU?
}
}
alan [等级:◆◆◆◆(中级)] (信誉值: 105) 回复于: 2005-5-25 15:33:51 Top
如果象你这样的话,是不会让出CPU的。
洋溢 [等级:◆◆◆◆◆(中级)] (信誉值: 100) 回复于: 2005-5-25 17:30:14 Top
如果线程函数结构如下:
DWORD ThreadFun(LPVOID para)
{
while(1)
{
阻塞语句;//执行到此处阻塞时,线程会不会让出CPU?
}
}
===================================================
会的,这个阻塞不应该是由于循环而产生的阻塞是会让出CPU的。
阻塞的函数如 WaitForSingleObject, recv,accept等,这类的阻塞是会让出CPU的。
说好不打脸 [等级:◆◆◆(初级)] (信誉值: 96) 回复于: 2005-5-25 18:46:43 Top
当然回
努力学习 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-5-25 19:48:45 Top
如果线程函数结构如下:
DWORD ThreadFun(LPVOID para)
{
while(1)
{
阻塞语句;//执行到此处阻塞时,线程会不会让出CPU?
}
}
--------------------------
会,因为调用阻塞的函数时你的线程就进入核心态了,已经不再执行用户态的代码,也就是说
你的线程执行了核心代码,就可以把控制转交给OS的调度程序,而调度程序就可以调用其他线程了。
应该是这样的吧
HR [等级:◆◆(初级)] (信誉值: 100) 回复于: 2005-5-25 19:55:20 Top
会,当然会。因为os的进程调度(或线程管理)程序会将你的线程冻结,将cpu给别的线程代码执行。
当然,如果你用buy-loop方式来等待别的线程的话,就不要交出cup了,因为os的进程调度(或线程管理)程序不认为(也不知道)你的线程需要冻结。明白?
好运。
好孩子 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-5-25 20:10:28 Top
实践证明,会
碧水蓝天 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-5-26 10:50:44 Top
我理解了,结论应该是会的;
只要线程进入阻塞或者挂起状态,调度器将剥夺其所分配的剩余CPU时间片,而执行别的线程.
谢谢大家!
碧水蓝天 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-5-26 10:55:04 Top
想再问一个问题:象这样的线程函数是不是会一直占用CPU?而其他的线程一直得不到CPU?
DWORD ThreadFun(LPVOID para)
{
while(1)
{
}
}
我不是王荣 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-5-26 10:55:23 Top
各位大虾:问下怎么实现显示两个点坐标然后测量两点间的距离啊 ?初学者问题,还有怎么提问题啊 ?
谢楼主不要踢小弟
凯 [等级:◆◆(初级)] (信誉值: 100) 回复于: 2005-5-26 11:39:44 Top
即使是死循环。系统也会强迫它让出CPU给其它线程。只是当前线程的其它代码执行不了而已。
碧水蓝天 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-5-26 12:38:58 Top
我实验的时候发现,有死循环的话,它非常占CPU资源,达100%99,是不是线程有死循环的话它的优先级将变得很高,系统为它优先分配CPU时间片
see you [等级:◆(初级)] (信誉值: 100) 回复于: 2005-5-26 14:44:05 Top
CPU利用率是系统处于和心态和用户态的比例,没有优先级问题,
flysec [等级:◆◆(初级)] (信誉值: 100) 回复于: 2005-5-26 14:58:00 Top
阻塞一定会让出CPU,不然为什么要设计阻塞得函数
只有循环不调用阻塞函数,而用立即返回函数的时候
才不会让出CPU,由操作系统自己调度
我握着爱情的门票静静排队…… [等级:★(中级)] (信誉值: 100) 回复于: 2005-5-26 15:03:50 Top
当然会让出CPU啦!
注意时间片的概念。Windows会每隔8ms切换一个线程的。
匿名 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-5-26 15:12:42 Top
进程有很多种状态,找本 os 看看
思考中的阿亮... [等级:◆◆(初级)] (信誉值: 100) 回复于: 2005-5-27 0:32:20 Top
会,
真正的阻塞,在硬件层面上就是等硬中断,在软件层面上就是等软中断,或者是等消息.
等中断,当前执行代码当然会让出CPU.
一桶江湖( http://adong2008.512j.com ) [等级:★★(中级)] (信誉值: 99) 回复于: 2005-5-27 12:07:26 Top
视你的代码而定.
碧水蓝天 [等级:◆(初级)] (信誉值: 100) 回复于: 2005-5-27 16:57:55 Top
谢谢大家
蒋晟.MSMVP2004Jan [等级:★★★★★(高级)] (信誉值: 262) 回复于: 2005-5-27 3:53:27 Top
一些操作系统会挂起阻塞的线程,但是一些操作系统不会——这完全取决于操作系统是否是多任务的,及其任务调度的算法。
空 气 [等级:★★(中级)] (信誉值: 115) 回复于: 2005-5-27 8:07:57 Top
真正意义的阻塞是会让出CPU的,OS中的实现是将线程相关的结构体指针置入一个等待队列,由于在事件产生前不会从等待队列中恢复到就绪或执行队列,当然也就是让出CPU了(系统并没有通过恢复现场再次切换到该线程的代码中)
空 气 [等级:★★(中级)] (信誉值: 115) 回复于: 2005-5-27 8:12:11 Top
死循环并不属于阻塞的情况,只要代码被分时调度都不属于阻塞
死循环所以占用很多CPU是因为其他程序中有一些阻塞,而他没有阻塞,相对而言,它取得CPU的机会多得多