C/ c++中的WaitForSingleObject和while循环

WaitForSingleObject and while loops in C/++

本文关键字:while 循环 WaitForSingleObject 中的 c++      更新时间:2023-10-16

代码片段:prog1:

HANDLE hM;
hM = CreateMutexA(NULL,TRUE, "abc"); // I have to use TRUE otherwise WaitForSingleObject fails.. by design it wants to take ownership and w//o TRUE there is no owner anyway right? <<-- **check this please if its true**
...

prog2:

HANDLE hM;
hM = OpenMutexA(MUTEX_ALL_ACCESS,NULL, "abc");
while(WaitForSingleObject(hM,INFINITE)) {
// do smthing
ReleaseMutex(hM);
hM = OpenMutexA(MUTEX_ALL_ACCESS,NULL, "abc"); // In order to continue while loop but it doesnt rewind,
}

Issue>它不会产生半无限循环…它进入一次,就这样。

的目的?监控一些进程的活动(如果它崩溃了,我重新启动它),无限循环正在打击我的CPU硬,我不能使用睡眠,我需要重新启动它asp(好吧,如果一些智能的解决方案是可能的,通过while(1)或for(;;)请发布)

应该是while(WaitForSingleObject(hM,INFINITE) == WAIT_ABANDONED){…},我没有复制正确:).

它工作一次,然后它不会再等待,有办法重置句柄吗?


prog1:

HANDLE hM;
hM = CreateMutexA(NULL,TRUE, "abc");

prog2:

HANDLE hM;
hM = OpenMutexA(MUTEX_ALL_ACCESS,NULL, "abc");
while(WaitForSingleObject(hM,INFINITE)) {    
ReleaseMutex(hM);
Sleep(1000);
CloseHandle(hM)
// do smthing like CreateProcess()
Sleep(1000);
hM = OpenMutexA(MUTEX_ALL_ACCESS,NULL, "abc");
}

这样就可以了,如果有人想对这篇文章发表评论

要检测进程崩溃,不应该使用互斥锁。只需等待进程句柄。一旦进程退出,该句柄将被发出信号,并且WaitForSingleObject将返回。

如果您正在创建进程,您可以从PROCESS_INFORMATION参数中获取进程句柄。然后,使用:

PROCESS_INFORMATION pi;
do {
// create the process, passing pi as the last argument to CreateProcess
} while (WaitForSingleObject(pi.hProcess, INFINITE));

注意手柄应该是关闭的,你可以计算出何时关闭。


Update -如果这不是一个选项,这是你的代码中的问题:

假设prog1成功启动,并且prog2现在正在等待互斥锁的信号。然后prog1崩溃,然后prog2拥有互斥锁。鉴于prog2的目的是重新启动prog1,我认为这是// do smthing中发生的事情。现在prog1启动,调用CreateMutexA。但是prog2可能仍然持有互斥锁,因此prog1只获得现有互斥锁的句柄,但它实际上并不拥有它。现在prog2调用ReleaseMutex,并继续等待一个不属于prog1的有信号互斥锁。等待立即返回WAIT_OBJECT_0,您退出while

所以,我认为prog1使用CreateMutexA是错误的。相反,您应该创建一个非所有的互斥锁,并等待它。这样,您将确保prog1对互斥锁的所有权。

我同意eran的观点,您应该直接等待进程句柄。

至于为什么你的代码在你认为应该进入while循环时没有进入,这很容易解决。当WaitForSingleObject返回0时,while循环终止。这是当它返回WAIT_OBJECT_0时,或者换句话说,当它获得互斥锁的所有权时。

您不需要重新打开互斥锁。WaitForSingleObject获取所有权,ReleaseMutex释放所有权,但是互斥锁保持打开状态,直到你调用CloseHandle。