线程进入阻塞时,线程会不会让出CPU?

 

看你说的阻塞指的是什么,如果是死循环,当然占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的机会多得多

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值