【问题标题】:What should I do when SetEvent return falseSetEvent返回false时我该怎么办
【发布时间】: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。您应该将其与TRUEFALSE 进行比较,而不是truefalse
  • 如果你使用 C,你可以使用 RaiseException 来抛出一个 Windows 异常。

标签: multithreading winapi events sync


【解决方案1】:

在 C++ 中,您可以抛出 C++ 异常来故意使进程崩溃。

在 C 语言中,您可以使用 Windows API 函数 RaiseException 很好地使进程崩溃,从而引发 Windows 结构化异常。

【讨论】:

    猜你喜欢
    • 2017-08-11
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多