C++ 调用SetEvent后调用CloseHandle

C++ 调用SetEvent后调用CloseHandle,c++,multithreading,winapi,mfc,C++,Multithreading,Winapi,Mfc,我的应用程序中运行了一个线程。在线程内部,我正在等待自动重置事件退出。我希望确保在使用事件句柄后关闭它。我有两个选择 调用SetEvent 在WaitForSingleObject 请告诉我哪种方法是正确的。在SetEvent之后调用CloseHandle对我来说没有意义。您应该(如果需要)仅在WaitForSingleObject之后调用CloseHandle。在所有线程使用完句柄后关闭句柄。WaitForSingleObject在我看来是合理的(因为如果它成功,SetEvent必须已经完成)

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

  • 调用
    SetEvent
  • WaitForSingleObject

  • 请告诉我哪种方法是正确的。

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

    在所有线程使用完句柄后关闭句柄。WaitForSingleObject在我看来是合理的(因为如果它成功,SetEvent必须已经完成)


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

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

    那么,如果WaitForSingleObject有一个超时参数并在另一个线程调用句柄上的SetEvent之前返回(超时),该怎么办呢。如果我们在定时WaitForSingleObject之后立即关闭句柄,那么稍后在句柄上最终调用SetEvent时,句柄将无效(通常是在开始的情况下),或者(更隐蔽但不太可能发生)有效,但指向某个完全不同的内核对象,该对象重用以前关闭的句柄表插槽。