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