Я делал многопоточное программирование в Visual Studio С++, используя вызовы beginthreadex, endthreadex.
Создаю дочерний поток thread1. Детский поток работает с функцией, которая никогда не выходит, поскольку она имеет бесконечный цикл. Теперь, если родительский поток завершается с ошибкой или заканчивается успешно, также выходит дочерний поток? Мое сомнение - есть ли ситуация, когда дочерний поток жив даже после выхода основной программы?
Для linux, каким должен быть этот случай?
Ответ 1
Между потоками нет отношений между родителями и дочерними элементами. Если поток A создает поток B, а затем поток A заканчивается, то поток B будет продолжать выполняться.
Исключением является то, что основной поток (то есть поток, который запускает функцию main()
) завершается. Когда это произойдет, процесс завершается, и все остальные потоки останавливаются.
Ответ 2
Так как C и С++ указывают, что возврат из функции main
убивает все запущенные потоки, да, процесс должен исчезнуть. И так как это поведение выполняется средой выполнения, то в Linux ситуация должна быть одинаковой.
Ответ 3
Как только ваш процесс умирает, все ресурсы освобождаются (память, файлы и потоки)
Правильный способ сделать это: когда вы вызываете beginthread, сохраните возвращаемый дескриптор в родительском потоке и вызовите WaitForObject, прежде чем покинуть программу (мы присоединяемся к родительскому потоку с дочерним потоком).
Родительский поток будет блокироваться до завершения дочернего потока. Если ваш дочерний поток имеет бесконечный цикл, вы можете определить "точку прерывания" и проверить, следует ли вам уйти. Например, используя общую логическую переменную. Проверьте Прервать вежливо за дополнительной информацией.