C++涉及到多线程时 会经常用到WINAPI WaitForSingleObject函数
但是因为很多网上资料 直接参考官网的英文翻译 很多地方比较晦涩难理解
个人也做了一些测试 才弄清楚了这个函数的一些使用
首先看百度上的说明
WaitForSingleObject函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止
我个人的理解为
WaitForSingleObject函数传入的hHandle对象 如果处于有信号的状态 就会返回
如果没有信号
则会挂起 时间由dwMilliseconds参数决定
最关键的是这个复位reset的概念
这里所讲的复位reset就是指hHandle对象置于无信号状态
看看下面的创建Event函数
HANDLECreateEvent(
LPSECURITY_ATTRIBUTESlpEventAttributes,// 安全属性
BOOLbManualReset,// 复位方式
BOOLbInitialState,// 初始状态
LPCTSTRlpName // 对象名称
);
第二个参数就是用于指定其复位方式
如果是true 即手工reset方式
那么线程调度到WaitForSingleObject函数 hHandle对象为有信号状态时
不会去修改hHandle对象的信号状态
如果是false
则自动reset
线程调用WaitForSingleObject函数时
自动吧hHandle对象置为无信号
关于如何设置HANDLE对象的信号状态
可以使用下面2个函数
ResetEvent( __in HANDLE hEvent ) //复位 即设置为无信号状态
SetEvent( __in HANDLE hEvent ) // 设置为有信号状态