gpt4 book ai didi

c++ - 多线程 Win32 C++ 程序在多线程中使用 try/catch 时崩溃

转载 作者:可可西里 更新时间:2023-11-01 09:26:00 25 4
gpt4 key购买 nike

我正在编写一个多线程程序,它会在抛出特定异常时崩溃。剥离了越来越多的代码来查找问题后,我现在只剩下一个极其简单的案例,它会导致许多不同的崩溃之一,似乎是随机的。我不知道为什么要这样做。

程序的全部内容如下:

#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;
}

据我所知,程序在尝试抛出时崩溃了,但不一定是第一次。

我在 Debug模式下遇到的错误是:

  • 段错误,堆栈跟踪包括:
    • 00403F70 _Unwind_SjLj_RaiseException(exc=0x474380) (../../../gcc-4.4.1/libgcc/../gcc/unwind.inc:113)
    • __cxa_throw() 中的 00000000 0x004025f6 (??:??)
    • 00401380 threadFunc(x=0x0) (D:\Software Projects\testcpp\main.cpp:6)
    • 7C80B729 KERNEL32!GetModuleFileNameA() (C:\WINDOWS\system32\kernel32.dll:??)
    • 00000000 0x00000000 在 ??() (??:??)
  • 程序已退出,代码为 03

并且在没有调试器的情况下运行:

  • “指令 0x something 引用了 0x something 处的内存”,有时一次,有时两次(大概是第二个线程)
  • “进程返回 -1073741819 (0xC0000005)”,这是一个访问冲突
  • “此应用程序已请求运行时以异常方式终止它...进程返回 3 (0x3)”

对于在如此短的程序中可能导致所有这些不同错误的原因,我完全感到困惑。注释掉其中一个 CreateThreads 会停止发生任何错误,因此它似乎与多线程和异常抛出的交互有关。

我使用的是 32 位 Windows XP SP3 和 MinGW 4.4.1

更新

问题似乎是编译器中的错误(即 TDM-2 mingw32 4.4.1 - 我问这个问题时不知道 TDM 元素,但我认为这没有什么区别) .升级到 4.6.1 版后,一切似乎都运行良好。

感谢所有为这个问题做出贡献的人。

最佳答案

更新 在评论中澄清错误立即发生,而不是在进程关闭时,我能看到的唯一剩余结论是:

  1. 这是编译器/运行时中的错误。
  2. 您正在链接单线程运行时,或者可能需要为多线程初始化运行时。您正在调用 CreateThread,但某些 C++ 运行时要求您使用运行时提供的线程创建函数。

您的问题可能是异常处理运行时支持在线程仍处于事件状态时被卸载。当您退出 main 函数时,运行时将自行关闭。我原以为运行时会比这更健壮,但就是这样。

如果您确保在退出主函数之前所有线程都已终止,我希望您的问题会消失。无论如何,这都是一种很好的做法,您不希望线程在任何情况下都被强制终止。

关于c++ - 多线程 Win32 C++ 程序在多线程中使用 try/catch 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8048377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com