Windows Win32 API:Mutex挂起,即使它';释放

Windows Win32 API:Mutex挂起,即使它';释放,windows,winapi,process,mutex,Windows,Winapi,Process,Mutex,我正在尝试通过互斥建立进程间通信。我有一个过程可以做到这一点: HANDLE hMutex = CreateMutex(NULL, TRUE, "amutex_name"); if (!hMutex) { puts("Error creating mutex. Aborting."); return; } for (int i = 0; i < 500; ++i) { if (WaitForSingleObject(hMutex, INFINITE) == WAIT

我正在尝试通过互斥建立进程间通信。我有一个过程可以做到这一点:

HANDLE hMutex = CreateMutex(NULL, TRUE, "amutex_name");
if (!hMutex) {
    puts("Error creating mutex. Aborting.");
    return;
}
for (int i = 0; i < 500; ++i) {
    if (WaitForSingleObject(hMutex, INFINITE) == WAIT_FAILED) {
        puts("Error waiting for mutex. Aborting.");
        return;
    }
    if (!ReleaseMutex(hMutex)) {
        puts("Error releasing mutex. Aborting.");
        return;
    }
    puts("MUTEX RELEASED");
    Sleep(2000);
}
CloseHandle(hMutex);
HANDLE hMutex = CreateMutex(NULL, FALSE, "amutex_name");
if (!hMutex) {
    puts("Error creating mutex. Aborting.");
    return;
}
while (1) {
    if (WaitForSingleObject(hMutex, INFINITE) == WAIT_FAILED)
        continue;
    if (!ReleaseMutex(hMutex)) {
        puts("Error releasing mutex. Aborting.");
        return;
    }
    puts("GOT ONE");
}
CloseHandle(hMutex);
第一个程序按预期输出大量释放的互斥锁,但第二个程序不输出任何东西。这是为什么?。。。从第一个程序中释放互斥体后,第二个程序应该有足够的时间(2000毫秒;即使我将其设置为更高,我也会得到相同的结果)通过
WaitForSingleObject
函数声明互斥体的所有权。我错过了什么?过去几个小时我一直在打自己的头

提前谢谢

  HANDLE hMutex = CreateMutex(NULL, TRUE, "amutex_name");
真正的论点并不是你所希望的那样。互斥锁是可重入的,线程可以多次获取互斥锁。它在内部统计所有者线程输入它的次数,释放互斥锁需要相等数量的ReleaseMutex()调用

因此,第一个程序使用bInitialOwner=TRUE参数立即获取它。然后WFSO调用再次获取它,内部计数器将为2。ReleaseMutex调用只能将计数器降回1,还不足以释放它。因此,只要循环在运行,第二个程序就永远无法获取它

调用CloseHandle()后情况变得更糟,操作系统现在将互斥体标记为已放弃。如果状态不好,它知道原始线程永远无法将内部计数器恢复为0。这使得第二个程序中的WFSO调用永久失败,WAIT_被放弃。您可能没有等待约20分钟进入该状态

通过传球获得领先。通过改进错误处理,如果您没有从WFSO调用中得到WAIT_OBJECT_0,那么就发生了非常糟糕的事情,您唯一的办法就是终止程序