2015-05-21 2 views
1

VS2013, C++ Я только что выпустил приложение для dll. Одна из функций приложения dll запускает поток _beginthread. В обычном программном потоке я использую мьютекс и управляющие потоки. Перед тем, как отменить регистрацию dll из основного приложения, я жду окончания завершения и закрытия обработчиков потоков.дочерние потоки C++, заканчивающиеся на выходе main() родительского потока?

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

Есть ли риск, если основной выход из приложения? Есть ли риск, если я запустил приложение и потоки снова после выхода? Есть ли риск для ОС? Все ли потоки завершаются после основного выхода?

Я знаю, что это «грязное» решение, но по какой-то причине я не могу это изменить.

Заранее благодарим за советы.

ответ

1

Согласно Raymond Chen - в системах Windows - если основной поток завершается, приложение зависает, пока все ваши потоки заканчиваются. Это означает, что ваше решение не будет работать, ваш поток заморозит ваше приложение в закрытом состоянии. Кроме того, даже если ваш поток будет принудительно завершен при выходе, он не будет неинициализирован, и, поскольку мы говорим о потоках MFC здесь, это приведет к тому, что ваше приложение будет утечка ресурсов, поэтому довольно пожалуйста не делайте этого!

+0

Интересно! «приложение зависает, пока все ваши потоки заканчиваются», это не значит, что он вешает навсегда. Я предполагаю, что потоки также завершаются временем выполнения, не так ли? –

+0

@ ValentinHeinitz Я настоятельно рекомендую прочитать связанную статью по этому вопросу ... Он разъясняет много вещей, которые у меня не было времени, чтобы объяснить себя. Кроме того, даже если среда выполнения завершает поток, вызывая «TerminateThread()» (или любые другие принудительные средства), все ресурсы, выделенные потоком, просачиваются, поэтому он все равно будет плохим решением. – mg30rg

1

Есть ли риск, если основной выход из приложения?

Да! Поскольку поток может начать процессы, чувствительные к консистенции.

Есть ли риск, если я запустил приложение и потоки снова после выхода?

Да! Может быть, предыдущее закрытие разрушило структуру данных, и теперь вы не можете даже правильно загрузить данные.

Есть ли риск для ОС?

Это зависит от вашего бизнеса. Может быть, вы создаете soft для оптимизации диска, и вы перемещаете кластеры во время аварийного отключения?

Все линки завершены после главного выхода?

Да! Вам нужно предусмотреть специальный код «join», который ждет выполнения потоков.

1

Я бы сказал, что поведение не определено. Слишком много может случиться, когда приложение прекращается без возможности очистки. Это SO question может дать некоторые идеи.

Этой MS article describes TerminateThread функции, а также перечислена некоторая прикосновенность неожиданно прекращения потока (который, вероятно, произошел от вызывающего выхода):

  • Если целевой поток имеет критическую секцию, критическую секцию не будет выпущен ,
  • Если целевой поток выделяет память из кучи, блокировка кучи не будет отпущена.
  • Если целевой поток выполняет определенные вызовы ядра32, когда он завершен, состояние kernel32 для процесса потока может быть непоследовательным.
  • Если целевой поток управляет глобальным состоянием общей библиотеки DLL, состояние DLL может быть уничтожено, что скажется на других пользователях DLL.

Так выглядит как есть риск даже для ОС

kernel32 состояния для процесса в нити может быть непоследовательным

+0

Некоторые непредвиденные последствия, которые я знаю о завершении потока извне: если у него были права на любые дескрипторы Windows (дескрипторы файлов или именованных труб, объекты ядра, разделяемая память или даже графические интерфейсы, которые менее вероятны, но возможны) эти ручки могут быть «просочились» (остаются невыпущенными). Если у него есть какой-либо объект синхронизации, заблокированный/сигнализированный (именованный мьютекс или событие, семафор и т. Д.), Он может оставаться заблокированным, что предотвращает запуск более позднего экземпляра. Если это было в середине файла с задержкой, он может оставить файл в противоречивом состоянии. Это может даже нанести вред файлу страницы ради бога! – mg30rg

Смежные вопросы