关于 Mutex 的废弃(abandoned)状态

说起来也是 Windows 下的老鸟了,原来由于用不到的缘故,一直对 Mutex 的废弃(abandoned)状态不甚了了,今天对 MSDN 详加查阅才搞明白。

Mutex 的互斥基本单位和大部分其他内核对象一样,也是线程,当一个线程占有此 Mutex 时,必须调用 ReleaseMutex() 显式将其释放,如果 Mutex 的属主线程没有释放它而结束,则该互斥量的就会成为废弃状态。此时,其余等待拥有此 Mutex 的线程之一将被激活,得到所有权。

老汉在此处原来有两个不清楚的地方:
1、所有权的归属问题
2、信号状态问题

导致第一个问题的原因是,我一直以为仅当 Wait 族函数显式返回 WAIT_OBJECT 类值,调用线程才算是得到了所等待的 Mutex 的所有权,实际上是返回 WAIT_ABANDONED 时也得到了所有权,因此,这两种状态下都需要有后续的 ReleaseMutex() 调用。

另外一件应该高度重视的事情是:废弃状态往往标志着发生了一个错误。比如,当使用 Mutex 来序列化对内存映射的读写操作时,如果检测到了一个废弃状态,则需要格外注意,因为极有可能上一次读写操作没有完成,所保护的内存映射处于不完整的状态,不应该继续使用,或者需要进行纠错处理。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注