Я пишу многопоточную программу, которая вылетает при возникновении определенного исключения.Извлекая все больше и больше кода, чтобы найти проблему, я теперь остался с чрезвычайно простым случаем, который вызывает один из множества различных сбоев, по-видимому, наугад.Я в недоумении, почему он это делает.
Вот все содержимое программы в ее нынешнем виде:
#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: \ Software Projects \ testcpp \ main.cpp: 6)
- 7C80B729 KERNEL32! GetModuleFileNameA () (C: \WINDOWS \ system32 \ kernel32.dll: ??)
- 00000000 0x00000000 в ?? () (??: ??)
- Программа завершена с кодом 03
и работает без отладчика:
- "Инструкция 0x что-то ссылается на память в 0x что-то еще ", иногда один раз,иногда дважды (предположительно длявторой поток)
- "Процесс возвратил -1073741819 (0xC0000005)", что является нарушением прав доступа
- "Это приложение запросило среду выполнения, чтобы завершить его необычным способом ... Процесс вернулся3 (0x3) "
Я полностью озадачен тем, что может быть причиной всех этих различных ошибок в такой короткой программе.Закомментирование одного из CreateThreads останавливает любые возникающие ошибки, поэтому, похоже, что-то связано с взаимодействием многопоточности и генерации исключений.
Я использую 32-битную Windows XP SP3 и MinGW 4.4.1
Обновление
Похоже, что проблема была в компиляторе (это TDM-2 mingw32 4.4.1 - я не знал об элементе TDM при задании вопроса, ноЯ не думаю, что это имеет значение).Вместо этого, обновившись до версии 4.6.1, все работает нормально.
Спасибо всем, кто внес вклад в этот вопрос.