多线程 Win32 C++ 程序在多个线程中使用 try/catch 崩溃
Posted
技术标签:
【中文标题】多线程 Win32 C++ 程序在多个线程中使用 try/catch 崩溃【英文标题】:Multithreaded Win32 C++ program crashes using try/catch in multiple threads 【发布时间】: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 版本后,一切似乎都正常。
感谢所有为这个问题做出贡献的人。
【问题讨论】:
mingw.org/Reporting_Bugs 【参考方案1】:更新在 cmets 中澄清错误会立即发生,而不是在进程关闭时发生,我能看到的唯一剩余结论是:
-
这是编译器/运行时的错误。
您正在链接单线程运行时,或者可能需要为多线程初始化运行时。您正在调用 CreateThread,但某些 C++ 运行时要求您使用运行时提供的线程创建函数。
您的问题可能是在线程仍处于活动状态时正在卸载异常处理运行时支持。当您退出主函数时,运行时将自行关闭。我原以为运行时会比这更健壮,但你去吧。
如果您在退出主函数之前确保所有线程都已终止,我希望您的问题会消失。无论如何,这是一种很好的做法,您不希望线程在任何情况下都被强制终止。
【讨论】:
对不起,这可能是我应该提到的 - 程序几乎立即崩溃。睡眠就在那里,因此崩溃发生在主线程终止之前 - 报告的执行时间始终低于 50 毫秒。 是的,我刚刚尝试了 Visual C++ 2005,然后尝试了更高版本的 MinGW - 两者似乎都可以正常工作,因此它确实似乎是 4.4.1 版本中的一个错误。感谢所有帮助过的人! 我看到你接受了这个。这是否意味着您知道问题所在?如果是这样,我也很想知道。以上是关于多线程 Win32 C++ 程序在多个线程中使用 try/catch 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
在 Win32/MFC 和 POSIX 中,线程会自行清理吗?