c++ - 如何重新启动崩溃的线程

标签 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);
    }
}

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

感谢您的宝贵时间。

最佳答案

这种方法行不通——一旦进程的内存空间被损坏(如果线程崩溃就一定会发生),试图从程序中获取有用的行为是一件傻事。即使您认为它可以工作,迟早您会发现它不能可靠地工作(例如,它只在某些硬件上或在某些条件下崩溃)。

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

如果由于某种原因你不能这样做,一个(不是很好)的解决方法是在子进程中而不是在线程中启动有错误的代码——这样,至少当子进程损坏自身,您的主进程将受到保护(如果您愿意,您可以安全地启动一个新的子进程)。然而,这只是一种黑客解决方法;正确的修复方法是首先确保代码没有错误,从而确保崩溃不会发生。

关于c++ - 如何重新启动崩溃的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54490005/

相关文章:

c++ - 我如何判断类型是否为仿函数?

c++ - 如何使用Boost获取2D点的凸包面积?

c++ - 没有指针时如何修复 'Segmentation Error'?

c++ - 类似于 Turbo C++ 的编辑器

vb.net - SyncLock 在单元测试中不起作用

Android fragment 和线程

c++ - 连接器 c++ res->getBoolean 访问冲突

c# - 我可以将鼠标事件处理程序放在单独的线程上吗?

java - 无法借助 Java 中的同步方法获得答案

multithreading - 尝试重新定义 IO::Tee::PRINT 以确保线程安全