使用无效句柄调用SetEvent

时间:2012-10-03 23:13:16

标签: c++ multithreading events memory initialization

我有一个应用程序,其中一个线程调用SetEvent,另一个线程等待该事件。但是,从未调用过CreateEvent。

SetEven返回false(ERROR_INVALID_HANDLE),WaitForSingleObject返回WAIT_FAILED

昨天,我们提交了一些显然不相关的内容:工具栏中.rc删除按钮中的两行代码。

突然,在realease-XP-32上, WaitForSingleObject返回WAIT_TIMEOUT

但我想知道:

1-为什么ressources中的提交(显然不相关)确实改变了WaitForSingleObject的返回值?

2-当我从Visual Studio启动应用程序(XP32)时,我得到的行为与直接启动应用程序时的行为不同。 WaitForSingleObject()返回WAIT_FAILED而不是超时。知道为什么吗?

2 个答案:

答案 0 :(得分:2)

由于您从未致电CreateEvent,因此您的SetEventWaitForSingleObject使用的是未初始化的变量。未初始化变量的内容是不确定的,因此您最终会将未知值传递给SetEventWaitForSingleObject。看来,对于旧代码,内存使用模式恰好导致未初始化变量的值不是有效句柄的情况,因此您得到ERROR_INVALID_HANDLE。进行更改后,内存使用模式发生了变化,现在未初始化的变量的值恰好是一个有效的句柄,因此WaitForSingleObject函数会尽职尽责地等待它。该句柄恰好引用未发信号的对象,因此WaitForSingleObject调用超时并返回WAIT_FAILED

换句话说,看似无关的变化暴露了预先存在的错误。使用未初始化的数据可能会导致像这样的非局部效应。

答案 1 :(得分:1)

如果您正在执行WaitForSingleObject(),那该调用实际上是否失败?也许它也抛出了无效的句柄错误所以它看起来只是“接收事件”。也可能在RC文件发生更改之前,实际上从未实际编译过的CreateEvent()代码。无论如何,如果没有看到代码,就没有办法告诉你。