线程调度、优先级和关联性(7)

本文详细介绍了Windows系统中线程的挂起、恢复、睡眠机制,以及线程优先级的相关概念。线程挂起和恢复可以通过ResumeThread和SuspendThread函数实现,睡眠则使用Sleep函数。此外,文章还讲解了线程的优先级设定,包括如何通过CreateProcess和SetThreadPriority函数调整线程优先级,并讨论了线程优先级的动态调整和IO请求优先级。最后,阐述了线程的关联性,包括软关联和硬关联,并提供了设置线程CPU关联性的函数SetThreadAffinityMask和SetThreadIdealProcessor。
摘要由CSDN通过智能技术生成

线程的挂起和恢复

线程内核中各有一个值表示线程的挂起计数。调用CreateProcess或者CreateThread时,系统将创建线程内核对象,并把挂起计数初始化为1。这样便不会给这个线程调度CPU了。

在线程初始化后,CreateProcess或者CreateThread函数将查看是否有CREATE_SUSPENDED标志传入。如果有,则函数返回,新线程立刻挂起。如果没有,函数会将线程的挂起计数递减为0,这时新线程变为可调度的,除非它还在等待某个事件发生(例如键盘输入等)。

当我们创建了一个处于挂起状态的线程后,我们可以使用ResumeThread函数:DWORD ResumeThread(HANDLE hThread);

如果函数调用成功,其返回线程前一个挂起计数。否则,它将返回0xffffffff。

一个线程可以被挂起多次,相应也要恢复多次。除了在创建线程时使用CREATE_SUSPENDED标志外,还可以通过调用SuspendThread来挂起线程。

DWORD SuspendThread(HANDLE hThread);

任何线程都可以调用这个函数挂起另一个线程(只要有线程句柄)。显然,线程可以挂起自己,但是无法自己恢复。SuspendThread返回的也是之前的挂起计数。一个线程最多可以挂起MAXIMUM_SUSPEND_COUNT(127)次。

睡眠

线程还可以告诉系统,在一段时间内自己不需要调度了。这可以通过调用Sleep实现:

VOID Sleep(DWORD dwMilliseconds);

调用此函数意味着:1.线程自愿放弃属于它的时间片中剩下的部分。
2.如果传入INFINITE,则是告诉系统,永远不要调度这个线程。
3.传入0,则是告诉系统,放弃当前cpu时间片的剩余时间。

## 线程执行时间 ##
可以使用GetThreadTimes函数,
BOOL GetThreadTimes(
HANDLE hThread,
PFILETIME pftCreationTime,
PFILETIME pftExitTime,
PFILETIME pftKernelTime,
PFILETIME pftUserTime);

这个函数返回四个不同的时间,创建时间:用100ns为单位,表示线程创建的绝对时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值