![](https://csdnimg.cn/release/download_crawler_static/85939968/bg6.jpg)
DWORD ResumeThread(HANDLE hThread);
每个线程都有一个挂起次数(suspend counts)与它相连,每次调用
SuspendThread(),挂起次数就加 1,调用 ResumeThread()时减 1。挂起次数为 0 时线
程没有被挂起,可以继续执行,这意味着这两个调用次数应相等。
线程可以挂起本身,但不能唤醒本身。若要把自己挂起一段指定时间后继续运
行,可用 Sleep()函数:
VOID Sleep(DWORD Duration);
参数 Duration 以毫秒为单位,指定挂起时间,到达时间后线程自动继续运行。
2.4 关于优先级的操作
在程序中,可以获取和更改进程和线程的优先级。对于进程的优先级类有如下
函数:
DWORD GetPriorityClass(HANDLE hProcess); // hProcess 为进程句柄
BOOL SetPriorityClass(HANEL hProcess, DWORD dwPriority);
对线程的优先级有这两个函数:
int GetThreadPriority(HANDLE hThread); //hThread 为线程句柄
BOOL SetThreadPriority(HANDLE hThread, int nPriority);
关于进程和线程的优先级见前面的讨论。
2.5 同步对象的使用
同步是允许用户控制两个或多个线程同时执行的机制。从前面的分析可看出,
Windows98 的每种同步对象可以处于两种状态:信号状态(signal state)或非信号状
态(nonsignal state)。当一个线程与某个对象相关联时,若该对象处于非信号状态,
则要等到其变成信号状态线程才能继续执行。为了实现等待一个对象达到信号状态
这一功能,WIN32 API 提供了等待命令 WaitForSingleObject 和
WaitForMutipleObjects。这两个等待命令可以用来等待下列 WIN32 核心对象:进程、
线程、互斥量、信号量、事件、可等待定时器、控制台输入(Console input)和文件
变化通知(File changte notification)等,但不包括临界区。其原型如下:
DWORD WaitForSingleObject(
HANDLE hObject, // 要等待的对象句柄
DWORD dwMilliseconds); // 最大等待时间(毫秒)
DWORD WaitforMultipleObjects(
DWORD dwNumObjects, // 要等待的对象数
LPHANDLE lpHandles, // 对象句柄数组
BOOL bWaitAll, // 是否等待所有对象都
有信号才返回
DWORD dwMilliseconds); // 最大等待时间
这两个函数分别用来等待单个对象和若干个对象。如果在指定时间内对象达到
信号状态则返回 WAIT_OBJECT_0,超时返回 WAIT_TIMEOUT,出错返回
WAIT_FAILED。对于互斥量、信号量和自动重置(auto-reset)事件对象,等待成功
时将它们改成非信号状态(信号量计数器减 1),以实现对象的互斥访问。
2.5.1 信号量(Semaphore)
信号量允许多个线程在给定限制条件下访问共享资源。用下面的函数创建一个