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

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

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

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

Ответы [ 3 ]

37 голосов
/ 12 января 2011

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

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

7 голосов
/ 12 января 2011

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

2 голосов
/ 12 января 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...