2011-11-08 44 views
3

我正在寫一個多線程程序,當拋出一個特定的異常時它會崩潰。已經剝離越來越多的代碼來發現問題,現在我只剩下一個非常簡單的案例,它會導致許多不同的崩潰之一,看起來是隨機的。我不知道爲什麼這樣做。多線程Win32 C++程序在多線程中使用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; 
} 

據我所知道的,而試圖拋出程序崩潰,但不一定是第一次。

我得到在調試模式下的錯誤是:

  • 賽格故障,帶有堆棧跟蹤,包括:
    • 00403F70 _Unwind_SjLj_RaiseException(EXC = 0x474380)(../../../ GCC-4.4.1/libgcc中/../ GCC/unwind.inc:113)
    • 00000000 0x004025f6在__cxa_throw()( - :??)
    • 00401380的ThreadFunc(X =爲0x0)(d:\軟件Projects \ testcpp \ main.cpp:6)
    • 7C80B729 KERNEL32!Ge tModuleFileNameA()(C:\窗口\ system32 \ kernel32.dll中:??)
    • 00000000在00000000 ??()( - :??)
  • 程序與代碼退出03

和運行沒有調試器:

  • 「指令0X 東西在0X 別的引用的內存」,有時一次,有時兩次(presumabl y代表第二個線程)
  • 「進程返回-1073741819(0000005)」,這是一個訪問衝突
  • 「此應用程序已請求運行時終止它在一個不尋常的方式...進程返回3段(0x3) 「

對於在這樣短的程序中可能會導致所有這些不同的錯誤,我完全難住。註釋掉其中一個CreateThreads會阻止發生的任何錯誤,所以它似乎與多線程和異常拋出的交互有關。

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

更新

這個問題似乎一直在編譯器(一個錯誤,這是TDM-2的mingw32 4.4.1 - 在提問時我並不知道TDM元素,但我不認爲這有什麼區別)。相反,升級到版本4.6.1似乎一切正常。

感謝所有參與此問題的人。

+0

http://www.mingw.org/Reporting_Bugs –

回答

3

更新已經澄清了該評論立即發生的錯誤,而不是在進程關閉,剩下的唯一的結論,我可以看到是:

  1. 這是編譯器/運行時錯誤。
  2. 您正在鏈接單線程運行時,或者可能需要初始化多線程運行時。您正在調用CreateThread,但某些C++運行時需要您使用運行時提供的線程創建功能。

你的問題可能是,異常處理運行時支持正在卸載而螺紋仍然有效。當您退出主函數時,運行時會自行關閉。我會期望運行時比這更強大,但是你去了。

如果您在退出主要功能之前確保所有線程都已終止,我認爲您的問題會消失。無論如何,這是個好習慣,你不希望線程在任何情況下被強行終止。

+0

對不起,這可能是我應該提到的 - 程序幾乎立即崩潰。睡眠正好在主線程終止之前發生崩潰 - 報告的執行時間總是低於50ms。 –

+0

是的,我剛剛嘗試過Visual C++ 2005,然後嘗試了更高版本的MinGW - 兩者似乎都能正常工作,所以它確實看起來是版本4.4.1中的一個錯誤。感謝所有幫助! –

+0

我看到你接受了這個。這是否意味着你知道問題是什麼?如果是這樣我也很想知道。 –