Выход дочерних потоков завершается, когда родительский поток завершается

20

Я делал многопоточное программирование в Visual Studio С++, используя вызовы beginthreadex, endthreadex.

Создаю дочерний поток thread1. Детский поток работает с функцией, которая никогда не выходит, поскольку она имеет бесконечный цикл. Теперь, если родительский поток завершается с ошибкой или заканчивается успешно, также выходит дочерний поток? Мое сомнение - есть ли ситуация, когда дочерний поток жив даже после выхода основной программы?

Для linux, каким должен быть этот случай?

  • 1
    Вот тесно связанный вопрос: stackoverflow.com/questions/2197699/…
  • 0
    Пост имеет противоречивые ответы.
Показать ещё 1 комментарий
Теги:

3 ответа

31
Лучший ответ

Между потоками нет отношений между родителями и дочерними элементами. Если поток A создает поток B, а затем поток A заканчивается, то поток B будет продолжать выполняться.

Исключением является то, что основной поток (то есть поток, который запускает функцию main()) завершается. Когда это произойдет, процесс завершается, и все остальные потоки останавливаются.

  • 8
    Два исключения. Если какой-либо поток вызывает exit , то все потоки завершаются.
  • 3
    Я также хотел бы добавить, что если main существует без вызова detach в запущенном потоке, вы получите исключение.
7

Так как C и С++ указывают, что возврат из функции main убивает все запущенные потоки, да, процесс должен исчезнуть. И так как это поведение выполняется средой выполнения, то в Linux ситуация должна быть одинаковой.

  • 0
    Ссылка, которую вы предоставили, ничего не говорит о требовании языка для уничтожения (!) Всех тем. Он лишь цитирует требование о том, что возврат из main эквивалентен вызову exit ().
2

Как только ваш процесс умирает, все ресурсы освобождаются (память, файлы и потоки)

Правильный способ сделать это: когда вы вызываете beginthread, сохраните возвращаемый дескриптор в родительском потоке и вызовите WaitForObject, прежде чем покинуть программу (мы присоединяемся к родительскому потоку с дочерним потоком).

Родительский поток будет блокироваться до завершения дочернего потока. Если ваш дочерний поток имеет бесконечный цикл, вы можете определить "точку прерывания" и проверить, следует ли вам уйти. Например, используя общую логическую переменную. Проверьте Прервать вежливо за дополнительной информацией.

  • 0
    Ваш случай в порядке, когда программа обычно завершается, то есть достигает конца main (). Но есть много мест в первичном или родительском потоке, которые вызывают exit (). Таким образом, exit () уничтожит все потоки?
  • 0
    @user97642 user97642 Если основной поток завершает работу, все остальные потоки останавливаются
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню