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

时间:2011-11-08 09:37:45

标签: c++ windows multithreading try-catch

我正在编写一个多线程程序,在抛出特定异常时会崩溃。我已经删除了越来越多的代码以找到问题,我现在留下了一个非常简单的案例,它会导致许多不同的崩溃之一,似乎是随机的。我不知道为什么要这样做。

这里是程序的全部内容:

#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 fault,堆栈跟踪包括:
    • 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

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

  • &#34;指令0x 某些引用内存为0x 其他&#34;有时一次,有时两次(大概是第二次线程)
  • &#34;进程返回-1073741819(0xC0000005)&#34;,这是一次访问冲突
  • &#34;此应用程序已请求Runtime以不寻常的方式终止它...进程返回3(0x3)&#34;

我完全不知道在这么短的程序中可能导致所有这些不同错误的原因。注释掉其中一个CreateThreads可以阻止发生任何错误,因此它似乎与多线程和异常抛出的交互有关。

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

更新

问题似乎是编译器中的一个错误(这是TDM-2 mingw32 4.4.1 - 在提出问题时我还没有意识到TDM元素,但我不认为它有所作为)。升级到版本4.6.1后,一切似乎都运行良好。

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

1 个答案:

答案 0 :(得分:3)

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

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

  3. 您的问题可能是在线程仍处于活动状态时卸载异常处理运行时支持。退出main函数时,运行时将自行关闭。我原本期望运行时比这更强大,但是你去了。

    如果您在退出主要功能之前确保所有线程都已终止,我希望您的问题会消失。无论如何,这都是好的做法,你不希望在任何情况下强行终止线程。