Windows中多线程‘饥饿’浅谈
2023-09-11 14:22:29 时间
前言
饥饿:如果一个线程因为 CPU 时间全部被其他线程抢走而得不到 CPU 运行时间,这种状态被称之为“饥饿”。
1. 饥饿产生的原因
(1)其它线程吞噬所有的 CPU 时间。
(2)线程被永久堵塞在一个等待进入同步块的状态,因为其他线程总是能在它之前持续地对该同步块进行访问。
2. 饥饿怎么处理
(1)首先,系统调度依据优先级来选择线程,但是如果优先级较低的线程长期不能得到执行,比如(2~4秒),系统就会认为该线程处于“饥饿”状态,就会临时提高该线程的优先级使得其可以执行一到两次。 实际应用中,我们应当确保优先级高的程序能够快速执行,然后恢复到睡眠或者挂起状态,以保证最大的实时性;而另优先级低的程序在大多时候可以调度执行。
(2)使用调度方法 BOOL SwitchToThread()。当前线程调用SwitchToThread时,系统会检查是否存在可调度的线程处于“饥饿”状态,如果没有找到,SwitchToThread立刻返回,系统继续执行当前线程,否则系统将暂停当前线程并调度处于“饥饿”状态的线程(无论该线程的优先级大小),“饥饿”线程的调度时间大约是一个时间片,然后系统调度将恢复正常。例如,当线程A需要获得某资源,而该资源又被另一优先级较低的线程B占用时,A可以调用SwitchToThread迫使操作系统调度低先级的进程,以期待B释放被占用的资源。当没有其它线程可调度时,SwitchToThread返回FALSE,否则返回一个非0值。
相关文章
- 如何在IIS上发布网站 在阿里云服务器windows server2012r iis上部署.net网站
- windows多线程没那么难
- windows7 照片查看器无法打开图片, windows提示因为可用内存不足,但我的内存4G?
- [windows菜鸟]C#中调用Windows API的技术要点说明
- 这可能是2023全网最详细的python安装教程(windows)
- windows下plsql 设置 里面timestamp显示的格式
- docker for windows--Windows 10 家庭中文版安装clickhouse 22.3版本及配置
- Redis下载安装教程-Windows版本(详细)
- windows系统-程序加载时生成栈和堆的过程
- 《Windows PowerShell实战指南(第2版)》——第3章 使用帮助系统 3.1 帮助系统:发现命令的方法
- windows下编译firefox
- windows driver inf文件
- Windows Server 2019组策略取消Ctrl+Alt+Delete组合
- windows下gitblit应用
- Windows XP 连接windows 7 远程桌面 软件
- Windows下C++多线程编程(入门实例)
- 玩转Windows,超简单一个命令进行windows系统升级,在需要的时间点,随时进行系统升级,体验最新的系统和特性
- windows--zabbix-agent添加主机