WaitForSingleObject和while循环在C / ++中

这里是代码片段: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,
}

问题>它不会造成半无限循环......它进入一次就是这样。

目的? 要监视某个进程的活动(如果它崩溃了,我重新启动它),无限循环正在触及我的CPU,并且无法使用Sleep,我需要重新启动它asasp(如果某些智能解决方案可以通过while(1)或for ;;)请发帖)

UPDATE

应该是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));

请注意,手柄应该关闭,您可以确定何时。


更新 - 鉴于这不是一个选项,这是你的代码中的问题:

说prog1成功启动,并且prog2正在等待互斥信号发出。 然后prog1崩溃,并且prog2拥有互斥量。 鉴于prog2的目的是重新启动prog1,我认为这是// do smthing// do smthing什么时发生的// 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。

链接地址: http://www.djcxy.com/p/62467.html

上一篇: WaitForSingleObject and while loops in C/++

下一篇: Timeout resolution of WaitForSingleObject