windows多线程之WaitForSingleObject中隐含的坑

本人微信公众号:CPP进阶之旅
如果觉得这篇文章对您有帮助,欢迎关注 “CPP进阶之旅” 学习更多技术干货

windows多线程之等待函数WaitForSingleObject

一、函数简介

该函数可以使线程进入等待状态,直到一个特定的内核对象进入有信号或者有通知的状态。

//函数原型
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、 不要在等待仍未完成的情况下关闭此句柄,则该函数的行为是不确定的。
在这里插入图片描述

三、重要说明

欢迎关注我的个人微信公众号,查看专业的客户端/服务端开发知识、笔试面试题目、程序员职场经验与心得分享。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/siyacaodeai/article/details/113412748