如何重新启动崩溃的线程



我正在等待一个线程,如果它崩溃了,我会重新启动它。

它在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);
}
}

我期待着线程像什么都没发生一样重新启动。

谢谢你抽出时间。

这种方法是行不通的——一旦进程的内存空间被破坏(如果线程崩溃,就必须如此),试图从程序中获得有用的行为是愚蠢的。即使你认为你已经让它工作了,你迟早会发现它工作不可靠(例如,它只在某些硬件上或在某些条件下崩溃)。

一个更好的方法是调试代码,这样它一开始就不会崩溃——这是使程序可靠和高效的唯一方法。

如果出于某种原因你不能做到这一点,一个(不太好的)解决方案是在子进程中而不是在线程中启动有缺陷的代码——这样,至少当子进程损坏自己时,你的主进程将受到保护(如果你想的话,你可以安全地启动一个新的子进程)。然而,这只是一个破解工作;正确的修复方法是首先确保代码没有错误,从而确保崩溃不会发生。

最新更新