windows线程切换的问题

wxf041041 2015-06-01 09:36:56
《操作系统》书上讲系统本来就具备自动调度线程的功能, 为什么在项目程序中的线程函数中看到还是要自己调用sleep函数?如果不调用sleep函数别的线程就得不到执行吗?比如一个线程函数中写了一个无线循环,中间不调用sleep的话就会一直占用CPU这是为什么?系统不会把这条线程调度走让别的线程执行吗?
...全文
320 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
bsnry 2015-06-06
  • 打赏
  • 举报
回复
这个问题,已经和人讨论过, 13楼和版主的答案比较认同。 根源在于线程调度算法导致的。 和sleep(0)无关吧
jiqiang01234 2015-06-05
  • 打赏
  • 举报
回复
引用 12 楼 wxf041041 的回复:
[quote=引用 11 楼 JASKLE 的回复:] 事实上一个死循环最多占满一个CPU核心。 Sleep是主动让出使用权 最优的方案是事件的内核等待,通过释放事件来激活线程
嗯,多谢指点,我的疑问主要是如果这个死循环不sleep的话,系统不会主动的让它“休息”一下吗?[/quote] 系统会让它“休息”一下,真的是小小地休息一下,否则别的线程就没法执行了。只是系统的线程调度算法认为这个死循环的线程比较需要cpu,会让这个线程更多地使用cpu
Jaskle 2015-06-04
  • 打赏
  • 举报
回复
事实上一个死循环最多占满一个CPU核心。 Sleep是主动让出使用权 最优的方案是事件的内核等待,通过释放事件来激活线程
wxf041041 2015-06-04
  • 打赏
  • 举报
回复
引用 11 楼 JASKLE 的回复:
事实上一个死循环最多占满一个CPU核心。 Sleep是主动让出使用权 最优的方案是事件的内核等待,通过释放事件来激活线程
嗯,多谢指点,我的疑问主要是如果这个死循环不sleep的话,系统不会主动的让它“休息”一下吗?
wxf041041 2015-06-03
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
搜“毛德操 windows线程调度”
好的,多谢赵老师指点。。
赵4老师 2015-06-03
  • 打赏
  • 举报
回复
搜“毛德操 windows线程调度”
Eleven 2015-06-02
  • 打赏
  • 举报
回复
引用 3 楼 wxf041041 的回复:
[quote=引用 2 楼 jiqiang01234 的回复:] 操作系统会根据线程优先级来调度线程执行。如果一个线程执行死循环,别的线程也会得到执行的机会,只是时间片分配的没那么多,也就是别的线程只能执行很少的代码。 人为调用sleep是想主动让出本线程的执行时间,可以调度给别的线程执行
谢谢回答,那么就是执行死循环的线程优先级比较高吗? 所以会一直给它分配时间片?[/quote] 也不能这么说,线程有个基本的优先级,内核会给它分配一个动态的优先级。这个动态优先级可能是时刻在调整的,这个是由操作系统内核确定的。一般的,优先级高的,分配的时间片会少一点,否则优先级低就可能不能得到响应。相应的优先级低的,分配的时间片会可能多一些。
wxf041041 2015-06-02
  • 打赏
  • 举报
回复
引用 2 楼 jiqiang01234 的回复:
操作系统会根据线程优先级来调度线程执行。如果一个线程执行死循环,别的线程也会得到执行的机会,只是时间片分配的没那么多,也就是别的线程只能执行很少的代码。 人为调用sleep是想主动让出本线程的执行时间,可以调度给别的线程执行
谢谢回答,那么就是执行死循环的线程优先级比较高吗? 所以会一直给它分配时间片?
jiqiang01234 2015-06-02
  • 打赏
  • 举报
回复
操作系统会根据线程优先级来调度线程执行。如果一个线程执行死循环,别的线程也会得到执行的机会,只是时间片分配的没那么多,也就是别的线程只能执行很少的代码。 人为调用sleep是想主动让出本线程的执行时间,可以调度给别的线程执行
esdhhh 2015-06-02
  • 打赏
  • 举报
回复
多写写代码自然而然就知道了
worldy 2015-06-02
  • 打赏
  • 举报
回复
引用 楼主 wxf041041 的回复:
《操作系统》书上讲系统本来就具备自动调度线程的功能, 为什么在项目程序中的线程函数中看到还是要自己调用sleep函数?如果不调用sleep函数别的线程就得不到执行吗?比如一个线程函数中写了一个无线循环,中间不调用sleep的话就会一直占用CPU这是为什么?系统不会把这条线程调度走让别的线程执行吗?
不管你要不要CPU时间,操作系统都会根据优先级给每个线程一个时间片,操作系统是无法知道你这个时间片是干什么以及用还是不用,线程如果没事可干了,这个时间片你要么使用死循环消耗掉,要么使用sleep将控制权交出,肯定的,傻子都知道,后者比前者效率要高了
oyljerry 2015-06-02
  • 打赏
  • 举报
回复
引用 3 楼 wxf041041 的回复:
[quote=引用 2 楼 jiqiang01234 的回复:] 操作系统会根据线程优先级来调度线程执行。如果一个线程执行死循环,别的线程也会得到执行的机会,只是时间片分配的没那么多,也就是别的线程只能执行很少的代码。 人为调用sleep是想主动让出本线程的执行时间,可以调度给别的线程执行
谢谢回答,那么就是执行死循环的线程优先级比较高吗? 所以会一直给它分配时间片?[/quote] 会更容易抢占到CPU。也要取决月CPU的调度算法
赵4老师 2015-06-02
  • 打赏
  • 举报
回复
《Windows核心编程》 《深入解析Windows操作系统-Windows Internals》
nettoysfkf 2015-06-02
  • 打赏
  • 举报
回复
推荐本书《windows核心编程》,我最近也在看这个。

15,473

社区成员

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

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