【发布时间】:2011-11-08 09:37:45
【问题描述】:
我正在编写一个多线程程序,它会在抛出特定异常时崩溃。剥离了越来越多的代码以找到问题所在,我现在只剩下一个极其简单的案例,它会导致许多不同的崩溃之一,似乎是随机的。我不知道为什么要这样做。
这是该程序的全部内容:
#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;
}
据我所知,程序在尝试投掷时崩溃,但不一定是第一次。
我在调试模式下遇到的错误是:
- seg 错误,堆栈跟踪包括:
- 00403F70 _Unwind_SjLj_RaiseException(exc=0x474380) (../../../gcc-4.4.1/libgcc/../gcc/unwind.inc:113)
- 00000000 0x004025f6 in __cxa_throw() (??:??)
- 00401380 threadFunc(x=0x0) (D:\Software Projects\testcpp\main.cpp:6)
- 7C80B729 KERNEL32!GetModuleFileNameA() (C:\WINDOWS\system32\kernel32.dll:??)
- 00000000 0x00000000 in ??() (??:??)
- 程序以代码 03 退出
并在没有调试器的情况下运行:
- “指令 0x something 引用了 0x something else 处的内存”,有时一次,有时两次(可能是第二个线程)
- “进程返回-1073741819 (0xC0000005)”,这是访问冲突
- “此应用程序已请求运行时以异常方式终止它...进程返回 3 (0x3)”
对于在如此短的程序中可能导致所有这些不同错误的原因,我完全感到困惑。注释掉其中一个 CreateThreads 会阻止任何错误的发生,因此它似乎与多线程和异常抛出的交互有关。
我使用的是 32 位 Windows XP SP3 和 MinGW 4.4.1
更新
问题似乎是编译器中的一个错误(即 TDM-2 mingw32 4.4.1 - 问问题时我不知道 TDM 元素,但我认为这没有什么区别) .升级到 4.6.1 版本后,一切似乎都正常。
感谢所有为这个问题做出贡献的人。
【问题讨论】:
标签: c++ windows multithreading try-catch