Многопоточная программа Win32 C ++ аварийно завершает работу, используя try / catch в нескольких потоках - PullRequest
3 голосов
/ 08 ноября 2011

Я пишу многопоточную программу, которая вылетает при возникновении определенного исключения.Извлекая все больше и больше кода, чтобы найти проблему, я теперь остался с чрезвычайно простым случаем, который вызывает один из множества различных сбоев, по-видимому, наугад.Я в недоумении, почему он это делает.

Вот все содержимое программы в ее нынешнем виде:

#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, все работает нормально.

Спасибо всем, кто внес вклад в этот вопрос.

1 Ответ

3 голосов
/ 08 ноября 2011

Обновление Уточнив в комментариях, что ошибки возникают немедленно, а не при остановке процесса, я вижу только следующие выводы:

  1. Этоошибка в компиляторе / среде выполнения.
  2. Вы ссылаетесь на однопоточное время выполнения или, возможно, необходимо инициализировать время выполнения для многопоточности.Вы вызываете CreateThread, но некоторые среды выполнения C ++ требуют использования функции создания потоков, предоставляемой во время выполнения.

Возможно, ваша проблема заключается в том, что поддержка обработки во время выполнения исключений выгружается, пока потоки все еще активны,Среда выполнения отключится при выходе из основной функции.Я ожидал бы, что среда выполнения будет более устойчивой, чем эта, но вы идете.

Я бы ожидал, что ваши проблемы исчезнут, если вы убедитесь, что все ваши потоки были прерваны до того, как вы вышли из своей основной функции.Это хорошая практика, несмотря ни на что, вы не хотите, чтобы потоки принудительно прерывались ни при каких обстоятельствах.

...