本人微信公众号:CPP进阶之旅
如果觉得这篇文章对您有帮助,欢迎关注 “CPP进阶之旅” 学习更多技术干货
一、函数简介
该函数可以使线程进入等待状态,直到一个特定的内核对象进入有信号或者有通知的状态。
//函数原型
DWORD WaitForSingleObject(
HANDLE hObject, //指明一个内核对象的句柄
DWORD dwMilliseconds); //等待时间
该函数需要传递一个内核对象句柄,该句柄标识一个内核对象,如果该内核对象处于未通知状态,则该函数导致线程进入阻塞状态;如果该内核对象处于已通知状态,则该函数立即返回WAIT_OBJECT_0。第二个参数指明了需要等待的时间(毫秒数),可以传递INFINITE指明要无限期等待下去,如果第二个参数为0,那么函数就测试同步对象的状态并立即返回。如果等待超时,该函数返回WAIT_TIMEOUT。如果该函数失败,返回WAIT_FAILED。
备注:
此函数检查指定的对象或事件的状态,如果该对象处于无信号状态,则调用线程处于等待状态,此时该线程不消耗CPU时间。
二、使用注意
根据WaitForSingleObject函数原型可知,该函数的使用比较简单,但越是简单的地方出现问题,越容易被我们忽视。
注意事项1、 如果在工作线程中有可能涉及到了消息驱动的API,也就是直接或者间接涉及到sendmessage相关的函数时,不能在主线程中使用WaitForSingleObject一类函数,因为很容易造成死锁。遇到这种场景,可以尝试使用 MsgWaitForMultipleObjects或 MsgWaitForMultipleObjectsEx来解决。如下是msdn上面关于WaitForSingleObject函数使用的提示。
注意事项2、 不要在等待仍未完成的情况下关闭此句柄,则该函数的行为是不确定的。
三、重要说明
欢迎关注我的个人微信公众号,查看专业的客户端/服务端开发知识、笔试面试题目、程序员职场经验与心得分享。