如果我在线程完成之前调用 CloseHandle 关闭互斥对象,从而还没有调用 ReleaseMutex,那么预期的行为是什么?
CloseHandle()
函数会立即销毁传递给它的句柄。如果使用已关闭的互斥体句柄调用 ReleaseMutex()
函数,则会返回错误代码 ERROR_INVALID_HANDLE
。
如果互斥体有名称,则有一个支持互斥体的单个引用计数内核对象,但是 CreateMutex()
和 OpenMutex()
返回唯一的 HANDLE
值,这些值必须分别关闭。如果创建/打开同名互斥体的多个句柄,则在一个句柄上调用 CloseHandle()
不会影响到同一互斥体的其他句柄。
最严重的后果是等待互斥锁的线程被解除阻塞。WaitXxx调用返回WAIT_ABANDONED。此时最好调用TerminateProcess,因为你不知道到底发生了什么。
WAIT_ABANDONED
。这与提前调用CloseHandle()
关闭互斥锁句柄是不同的。 - Remy Lebeau