您的位置:首页 > 编程语言 > C语言/C++

Windows Via C/C++:线程的睡眠和切换

2009-10-25 00:51 369 查看

睡眠:Sleep

线程可以调用Sleep函数使其在指定时间内不被调度:

VOID Sleep(DWORD dwMilliseconds);

Sleep调用会挂起当前线程,dwMilliseconds毫秒之后再将其恢复为可调度的。Sleep函数有以下几点值得注意:

Sleep调用会导致当前线程放弃其剩余的时间片

Sleep调用时,系统挂起当前线程的时长大约是dwMilliseconds毫秒——比如,当dwMilliseconds设置为100时,在大多数情况下,当前线程睡眠的时长并不会是100ms,可能是几百毫秒、几秒、几分钟甚至更长。因为Windows并不是一个实时系统,所以dwMilliseconds只是一个建议值

为dwMilliseconds传递INFINITE会使当前线程永远睡眠,这通常没什么用处

为dwMilliseconds传递0时,当前线程会放弃剩余的时间片,系统会尝试调度优先级等于或高于当前线程
的可调度线程,如果没有找到这样的线程,系统将马上重新调度调用Sleep的线程

切换:SwitchToThread

当前线程可以调用SwitchToThread强迫操作系统调度另外的可调度线程(如果存在):

BOOL SwitchToThread();

当前线程调用SwitchToThread时,系统会检查是否存在可调度的线程处于“饥饿”状态,如果没有找到,SwitchToThread立刻返回,系统继续执行当前线程,否则系统将暂停当前线程并调度处于“饥饿”状态的线程(无论该线程的优先级大小),“饥饿”线程的调度时间大约是一个时间片,然后系统调度将恢复正常。

当线程A需要获得某资源,而该资源又被另一优先级较低的线程B占用时,A可以调用SwitchToThread迫使操作系统调度低先级的进程,以期待B释放被占用的资源。当没有其它线程可调度时,SwitchToThread返回FALSE,否则返回一个非0值。

SwitchToThread函数和Sleep(0)调用类似,不同之处在于SwitchToThread允许系统调度优先级低于当前线程的可调度线程,但Sleep(0)只允许调度优先级不低于当前线程的可调度线程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: