我正在尝试等待一个线程,并在它崩溃时重新启动它。
它在 if
语句内部的部分崩溃。 (如果我将其取出并用 Sleep
替换,然后终止 Process Explorer 内的线程,我不会收到任何错误(但线程也不会重新启动)。我收到的错误是一个异常由于 ws2_32.dll
中的堆栈溢出。我尝试在函数内部调用当前函数,看看在使用 VirtualAlloc()
后它是否可以工作,memcpy()
以及没有再次完成的操作,但在尝试重新启动线程时遇到了相同的错误。
我注意到,在 Procexp 中,新的(重新启动的)线程实际上运行了一会儿,直到程序崩溃。
HANDLE theadHandle = CreateThread(NULL, 0, LPTHREAD_START_ROUTINE(code), NULL, 0, NULL);
while (true) {
...
BOOL state = WaitForSingleObject(threadHandle, 0); // Checks if the the thread has died and if so restarts it
if (state == WAIT_OBJECT_0) {
threadHandle = CreateThread(NULL, 0, LPTHREAD_START_ROUTINE(code), NULL, 0, NULL);
}
}
我期待线程重新启动,就像什么都没发生过一样。
感谢您的宝贵时间。
最佳答案
这种方法行不通——一旦进程的内存空间被损坏(如果线程崩溃就一定会发生),试图从程序中获取有用的行为是一件傻事。即使您认为它可以工作,迟早您会发现它不能可靠地工作(例如,它只在某些硬件上或在某些条件下崩溃)。
更好的方法是调试代码,使其从一开始就不会崩溃——这是使程序可靠且高效的唯一方法。
如果由于某种原因你不能这样做,一个(不是很好)的解决方法是在子进程中而不是在线程中启动有错误的代码——这样,至少当子进程损坏自身,您的主进程将受到保护(如果您愿意,您可以安全地启动一个新的子进程)。然而,这只是一种黑客解决方法;正确的修复方法是首先确保代码没有错误,从而确保崩溃不会发生。
关于c++ - 如何重新启动崩溃的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54490005/