如果我在线程完成互斥锁之前在互斥锁上调用CloseHandle,因此尚未调用ReleaseMutex,那么预期的行为是什么?
答案 0 :(得分:11)
CloseHandle()
会立即销毁传递给它的句柄。如果使用已关闭的互斥锁句柄调用,ReleaseMutex()
将失败,并显示ERROR_INVALID_HANDLE
错误代码。
如果指定了互斥锁,则会有一个引用互斥锁的引用计数内核对象,但CreateMutex()
和OpenMutex()
会返回必须单独关闭的唯一HANDLE
值。如果创建/打开了同一个命名互斥锁的多个句柄,则在一个句柄上调用CloseHandle()
不会影响同一互斥锁的其他句柄。
答案 1 :(得分:10)
最严重的后果是正在等待互斥锁被解除阻塞的线程。 WaitXxx调用返回WAIT_ABANDONED。在这一点上,调用TerminateProcess是一个非常好的主意,因为你不知道到底发生了什么。
答案 2 :(得分:3)
CloseHandle()会破坏句柄,但只有当所有句柄都已关闭时,互斥对象才会从内存中删除。 因此,通过CloseHandle(句柄),您将销毁该句柄,因此ReleaseMutex(句柄)将无法工作。但是,互斥锁仍将由该线程拥有,无法释放它,影响等待互斥锁的其他线程。