如何重新启动崩溃的线程

时间:2019-02-02 04:32:23

标签: c++ multithreading

我试图等待一个线程,如果它崩溃则重新启动它。

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

我希望线程重新启动,好像什么也没发生。

谢谢您的时间。

1 个答案:

答案 0 :(得分:3)

这种方法行不通-一旦进程的内存空间被破坏(线程崩溃时必须如此),试图从程序中获取有用的行为是愚蠢的。即使您认为它可以正常工作,迟早也会发现它不能可靠地工作(例如,它仅在某些硬件或特定条件下崩溃)。

一种更好的方法是调试代码,以使其永远不会崩溃—这是使程序可靠和高效的唯一方法。

如果由于某种原因您不能执行此操作,那么(不是很好)的解决方法是在子进程中而不是线程中启动错误代码-至少在子进程中自身损坏,您的主进程将受到保护(然后,如果需要,您可以安全地启动新的子进程)。但是,这只是一个解决方法。正确的解决方法是通过确保代码没有错误来确保崩溃不会首先发生。