在ReleaseMutex之前,在Mutex上关闭手柄 - 会发生什么?

时间:2011-02-17 20:38:04

标签: c++ multithreading mutex

如果我在线程完成互斥锁之前在互斥锁上调用CloseHandle,因此尚未调用ReleaseMutex,那么预期的行为是什么?

3 个答案:

答案 0 :(得分:11)

CloseHandle()会立即销毁传递给它的句柄。如果使用已关闭的互斥锁句柄调用,ReleaseMutex()将失败,并显示ERROR_INVALID_HANDLE错误代码。

如果指定了互斥锁,则会有一个引用互斥锁的引用计数内核对象,但CreateMutex()OpenMutex()会返回必须单独关闭的唯一HANDLE值。如果创建/打开了同一个命名互斥锁的多个句柄,则在一个句柄上调用CloseHandle()不会影响同一互斥锁的其他句柄。

答案 1 :(得分:10)

最严重的后果是正在等待互斥锁被解除阻塞的线程。 WaitXxx调用返回WAIT_ABANDONED。在这一点上,调用TerminateProcess是一个非常好的主意,因为你不知道到底发生了什么。

答案 2 :(得分:3)

在这种情况下,

CloseHandle()会破坏句柄,但只有当所有句柄都已关闭时,互斥对象才会从内存中删除。 因此,通过CloseHandle(句柄),您将销毁该句柄,因此ReleaseMutex(句柄)将无法工作。但是,互斥锁仍将由该线程拥有,无法释放它,影响等待互斥锁的其他线程。

相关问题