【发布时间】:2014-10-27 15:15:19
【问题描述】:
我正在编写一个小程序,该程序执行 4 个线程将执行 funcA(),我使用事件对象和 WaitForMultipleObject() 使主线程阻塞,直到 4 个线程完成他们的任务,这很容易知道我将在 funA() 中使用 setEvent(),我想知道如果 SetEvent() 执行失败,我该怎么办,main 总是会阻塞?他们有什么办法避免这种情况?
P.S:我只知道当 HANDLE 无效时 SetEvent 会失败,他们还有什么失败的原因吗?
【问题讨论】:
-
请提供更多上下文/示例。还有,失败后直接GetLastError()的值是多少?
-
@NuSkooler 代码很简单,我的代码没有错,我只是想让我的代码健壮,所以我在任何地方都使用
if(false == SetEvent(myHandle)),当条件为真时,myHandle 不是set 发出信号,所以我只是简单地返回 false,但我认为这不是那么健壮,因为我的主线程将永远等待 myHandle,我应该使用 CloseHandle(myHandle) 来避免这种情况吗? -
SetEvent() 失败是一个非常令人讨厌的事故。太糟糕了,您要么完全忽略失败的可能性,因为您的程序状态已损坏,以至于诊断只会给出错误的线索。或者您立即终止您的程序,以免造成进一步的伤害。
-
如果您遇到意外的程序状态,您将无能为力。立即终止程序(使用 C 时)或抛出异常而不捕获它并让
unexpected()-handler 执行其职责。顺便说一句,SetEvent返回一个BOOL。您应该将其与TRUE或FALSE进行比较,而不是true或false。 -
如果你使用 C,你可以使用 RaiseException 来抛出一个 Windows 异常。
标签: multithreading winapi events sync