我有 2 个进程(A、B)共享相同的互斥锁(使用 WaitForSingleObject / ReleaseMutex 调用)。一切正常,但是当进程 A 崩溃时,进程 B 正在愉快地嗡嗡作响。当我重新启动进程 A 时,出现了死锁。
更深入的调查显示,在进程 A 崩溃后,进程 B 可以成功调用 ReleaseMutex() 两次。
我的解释:进程 A 崩溃后,互斥锁仍然被锁定,但互斥锁的所有权很容易转移到进程 B(这是一个错误)。这就是为什么它愉快地嗡嗡作响,调用 WaitForSingleObject(得到 WAIT_OBJECT_0 作为回报)和 ReleaseMutex(得到 TRUE 作为回报)。
是否可以使用类似于 Mutex 的命名同步原语,以使进程 A 中的崩溃将释放互斥锁?
一种解决方案是使用 SEH 并捕获崩溃并释放互斥锁,但我真的希望 Windows 有一个健壮的原语,不会像进程崩溃那样死锁。