《Win32多线程程序设计》读书笔记(三)
第三章
忙等 Busy Waiting
忙等,在这里就是不断调用GetExitCodeThread函数,直到结果不再是STILL_ACTIVE,它十分浪费CPU时间。
举个最简单的例子:
...
GetExitCodeThread(hThrd, &exitCode)
while(STILL_ACTIVE == exitCode);
...
这就是忙等。
处于忙等会让主线程一直处于这个while循环中去判断exitCode的值是否等于STILL_ACTIVE,这实在是太浪费时间了!不仅如此,你可能由于这一个程序,导致其他进程资源被抢占,也就是其他应用卡顿,这简直是灾难!
所以千万不要用忙等。
性能监视器 (Performace Monitor)
在现在的Windows10系统中依旧有原来老NT老95的性能监视器的功能的系统应用。
也就是现在的任务管理器(Task Manager),里面可以监视各个进程占用资源情况,性能情况等。
等待一个线程的结束
Win32提供了一个名为WaitForSingleObject的函数,能够在某个线程结束时被调用。
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
dwMilliseconds
指等待的最长时间,如果到了最长时间,handle尚未成为激发状态,则还是要返回。指定0
,表示立即返回;指定INFINITE表示无穷等待。
如果函数失败,返回WAIT_FAILED,可以用GetLastError获取错误信息。
函数成功时,如果等待的目标核心对象变成激发状态,返回WAIT_OBJECT_0;
如果等待的核心对象变成激发态之前,等待时间过了,则返回WAIT_TIMEOUT;
如果一个拥有mutex(互斥器)的线程结束前没有释放mutex,则传回WAIT_ABANDONED。
通过这个函数,就可以改良之前的代码:
WaitForSingleObject( hThrd, INFINITE);
被激发的对象 (Signaled Objects)
可被WaitForSingleObject使用的核心对象有两种状态:激发与未激发。
当核心对象被激发时,会导致WaitForSingleObject醒来。Wait也是如此。
线程执行时,线程对象处于未激发状态;线程结束时,线程对象就被激发。
2020.04.13