【问题标题】:Calling CloseHandle after calling SetEvent调用 SetEvent 后调用 CloseHandle
【发布时间】:2011-09-21 02:36:06
【问题描述】:

我的应用程序中有一个线程正在运行。在线程内部,我正在等待自动重置事件退出。我想确保在使用后关闭事件的句柄。我有两个选择。

  1. 在调用SetEvent 后立即调用事件的CloseHandle
  2. WaitForSingleObject 行之后调用CloseHandle

请建议我哪种方法是正确的。

【问题讨论】:

    标签: c++ multithreading winapi mfc


    【解决方案1】:

    当您确定事件已完成其工作并且不再需要时,关闭事件句柄。在您的情况下,这是在您检测到它已设置之后。所以,在WaitForSingleObject 解除阻塞后关闭事件句柄。

    【讨论】:

      【解决方案2】:

      当所有线程都使用完后关闭句柄。在 WaitForSingleObject 对我来说听起来很明智之后(因为如果它成功,则 SetEvent 必须已经完成)。

      或者 - 给每个线程自己的句柄副本(例如通过 DuplicateHandle),并在完成后关闭它们的副本。这更难出错,并且需要更少的代码分析。

      【讨论】:

        【解决方案3】:

        SetEvent 之后调用CloseHandle 对我来说没有意义。您应该(如果需要)仅在 WaitForSingleObject 之后致电 CloseHandle

        【讨论】:

        • 那么,如果 WaitForSingleObject 有一个超时参数并在其他线程调用句柄上的 SetEvent 之前返回(超时时)怎么办。如果我们在定时的 WaitForSingleObject 之后立即关闭句柄,那么稍后当最终在句柄上调用 SetEvent 时,句柄将无效(通常是开始情况),或者(更隐蔽但不太可能发生)有效但指向某些完全不同的内核对象,它重用了以前关闭的句柄表槽。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-13
        • 2019-06-08
        • 1970-01-01
        相关资源
        最近更新 更多