C/ c++中的WaitForSingleObject和while循环
WaitForSingleObject and while loops in 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,
}
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。
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- while循环中while循环的时间复杂度是多少
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 擦除while循环中迭代的元素
- 为什么我不能在 while 循环中创建线程?
- 退出简单while循环时出现问题
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 嵌套While循环不起作用(C++问题)
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 使用 GMP 的 while 循环出现问题
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 为什么在 while 循环中返回表达式不起作用
- 如何使用 do while 循环确定最高值和最低值
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 用于在 C++ 中使用 while 循环查找下一个素数的简单函数
- OpenCV QT,显示视频的帧(不使用while循环)
- 在 while 循环中使用 pow() 函数 C++
- C++ 制作/命名不初始化的向量(在 while 循环中)
- std::getline没有在while循环中重新请求用户输入