多线程笔记2

第三章:快跑与等待

1.绝对不要在win32中使用busy loop。

2.等待一个线程的结束:

DWORD WaitForSingleObject(
HANDLE hHandle,                   //等待对象的handle
DWORD dwMilliseconds            //等待时间,时间终了,即使handle尚未激发,此函数还是要返回。0立刻返回,INFINITE无穷等待

);

  函数失败:返回WAIT_FAILED

  函数成功:

  (1)等待的目标核心对象变成激发状态,返回值为WAIT_OBJECT_0

  (2)核心对象激发之前,等待时间终了,返回值为WAIT_TIMEOUT

  (3)如果一个拥有mutex的线程结束前没有释放mutex,则传回WAIT_ABANDONED

3.核心对象激发的意义

(1)Thread :线程运行时处于未激发状态,线程结束对象被激发。对象由CreateThread或CreateRemoteThread产生。

(2)Process:进程运行时处于未激发状态,进程结束对象被激发。对象由CreateProcess或OpenProcess产生。

(3)Change Notification:当一个特定的磁盘子目录发生变化时,此对象即被激发。此对象由FindFirstChangeNotification产生。

(4)Console Input:当console窗口输入缓冲区中有数据可用时,此对象处于激发状态。CreateFile、GetStdFile产生console handle。

(5)Event:对象的状态受控于3个win32函数:SetEvent,PulseEvent,ResetEvent。CreateEvent、OpenEvent可以传回一个Eventobject handle。Event对象的状态也可以被操作系统设定---如果使用与overlapped操作时。

(6)Mutex:如果Mutex没有被任何线程拥有,就是处于激发状态。一旦一个等待mutex的函数返回了,mutex自动重置为未激发状态。CreateMutex、OpenMutex可以获得一个mutex handle。

(7)Semaphore:有个计数器,约束拥有者个数。计数器大于0,semaphore处于激发状态;等于0,处于未激发状态。CreateSemaphore,OpenSemaphore可以传回一个semaphore handle。

  补充说明(3):这些变化指的是:      

FILE_NOTIFY_CHANGE_FILE_NAME       产生、删除、重新命名一个文件
FILE_NOTIFY_CHANGE_DIR_NAME        产生或删除一个子目录
FILE_NOTIFY_CHANGE_ATTRIBUTES     目录及子目录中的任何属性改变
FILE_NOTIFY_CHANGE_SIZE                 目录及子目录中的任何文件大小的改变
FILE_NOTIFY_CHANGE_LAST_WRITE     目录及子目录中的任何文件的最后写入时间的改变
FILE_NOTIFY_CHANGE_SECURITY         目录及子目录中的任何安全属性改变

4.等待多个对象

DWORD WaitForMultipleObjects(
DWORD nCount,                                     //表示lpHandles所指之handles数组的元素个数。最大容量是MAXIMUM_WAIT_OBJECTS
CONST HANDLE *lpHandles,                    //指向一个由对象handles所组成的数据,这些handles不需要为相同的类型。
BOOL bWaitAll,               //True表示所有的handles都必须激发,函数才返回。否则此函数将在任何一个handle激发返回。
DWORD dwMilliseconds           //等待时间
);

返回值:

(1)如果因时间终了返回,返回值为WAIT_TIMEOUT

(2)如果bWaitAll为True,返回值为WAIT_OBJECT_0

(3)如果bWaitAll为False,则将返回值减去WAIT_OBJECT_0,就表示数组中的哪个handle被激发了

(4)如果等待的对象中有任何的Mutex,返回值可能从WAIT_ABANDONED_0 到 WAIT_ABANDONED_0 + nCount - 1.

(5)如果函数失败,传回WAIT_FAILED.

5.MsgWaitForMultipleObjects:  “对象被激发” 或 “消息到达队列” 时被唤醒而返回

DWORD MsgWaitForMultipleObjects(
DWORD nCount,
LPHANDLE pHandles,
BOOL fWaitAll,
DWORD dwMilliseconds,
DWORD dwWakeMask               //欲观察的用户输入消息
);

输入消息:

QS_ALLINPUT
QS_HOTKEY
QS_INPUT
QS_KEY
QS_MOUSE
QS_MOUSEBUTTON
QS_MOUSEMOVE

QS_PAINT
QS_POSTMESSAGE
QS_SENDMESSAGE
QS_TIMER

原文地址:https://www.cnblogs.com/programmer-wfq/p/4636247.html