zl程序教程

您现在的位置是:首页 >  系统

当前栏目

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值。