《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

posted @ 2020-04-13 14:08  Lazy_V  阅读(238)  评论(0编辑  收藏  举报