C++ win开发 WaitForSingleObject函数

来源:互联网 发布:afnetworking数据缓存 编辑:程序博客网 时间:2024/05/29 04:20

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 )     // 设置为有信号状态





0 1
原创粉丝点击