我正在编写一个多线程程序,在抛出特定异常时会崩溃。我已经删除了越来越多的代码以找到问题,我现在留下了一个非常简单的案例,它会导致许多不同的崩溃之一,似乎是随机的。我不知道为什么要这样做。
这里是程序的全部内容:
#include <windows.h>
WINAPI DWORD threadFunc(LPVOID x) {
while (true) {
try {
throw 1;
} catch (...) {
}
}
return 0;
}
int main(int argc, char *argv[]) {
CreateThread(NULL, 0, threadFunc, NULL, 0, NULL);
CreateThread(NULL, 0, threadFunc, NULL, 0, NULL);
Sleep(1000);
return 0;
}
据我所知,该程序在尝试投掷时崩溃,但不一定是第一次。
我在调试模式下遇到的错误是:
并在没有调试器的情况下运行:
我完全不知道在这么短的程序中可能导致所有这些不同错误的原因。注释掉其中一个CreateThreads可以阻止发生任何错误,因此它似乎与多线程和异常抛出的交互有关。
我使用的是32位Windows XP SP3和MinGW 4.4.1
问题似乎是编译器中的一个错误(这是TDM-2 mingw32 4.4.1 - 在提出问题时我还没有意识到TDM元素,但我不认为它有所作为)。升级到版本4.6.1后,一切似乎都运行良好。
感谢所有为此问题做出贡献的人。
答案 0 :(得分:3)
更新在评论中澄清了错误是立即发生的,而不是在流程关闭时,我能看到的唯一剩下的结论是:
您的问题可能是在线程仍处于活动状态时卸载异常处理运行时支持。退出main函数时,运行时将自行关闭。我原本期望运行时比这更强大,但是你去了。
如果您在退出主要功能之前确保所有线程都已终止,我希望您的问题会消失。无论如何,这都是好的做法,你不希望在任何情况下强行终止线程。