процессы только завершаются, когда потоки прекращаются? - PullRequest
0 голосов
/ 28 августа 2018

Процессы должны завершаться только тогда, когда все их потоки прекращено!

Это вопрос в нашем фиктивном экзамене, и мы не уверены, является ли утверждение верным или ложным.

Большое спасибо

1 Ответ

0 голосов
/ 28 августа 2018

Во-первых, я должен указать, что этот экзаменационный вопрос содержит неверное предположение. Запущенный процесс всегда имеет хотя бы один поток. Исходный поток, поток, который сначала вызывает main или эквивалентный, не является специальным; это так же, как и любой другой поток, созданный pthread_create или его эквивалентом. Как только все потоки внутри процесса вышли, процесс больше не может ничего делать - у него нет возможности выполнить даже одну дополнительную инструкцию ЦП. На практике операционная система завершит процесс в этот момент.

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

Если вы конкретно говорите о потоках POSIX ("pthreads"), ответ на описательный вопрос состоит в том, что это зависит от того, как завершается каждый поток. Если все потоки завершаются с помощью вызова pthread_exit или отмены, процесс будет работать до тех пор, пока не завершится последний поток, независимо от того, в каком порядке они выходят. С другой стороны, если какой-либо поток вызывает exit или _exit, или получает фатальный сигнал, который немедленно завершит весь процесс, независимо от того, сколько потоков все еще активно. (Я не уверен на 100% в этом, но я думаю не имеет значения, были ли отсоединены какие-либо потоки.)

Существует еще одно осложнение, заключающееся в том, что возврат из функции, переданной в pthread_create, эквивалентен вызову pthread_exit для этого потока, а возврат из main эквивалентен вызову exit. Это делает начальный поток немного особенным: если вы специально не завершите main, вызвав pthread_exit, весь процесс будет завершен при выходе из исходного потока. Но технически это не свойство самого потока, а кода, выполняющегося в этом потоке.

Я не знаю ответа на описательный вопрос для библиотек потоков, отличных от POSIX; в частности, я не знаю ответа ни для собственных потоков Windows, ни для библиотеки потоков, добавленной в ISO C в его редакции 2011 года.

Ответ на вопрос о предписывающем вопросе - да, за исключением. Вы, программист, должны писать программы, которые в нормальных условиях позаботятся о том, чтобы завершить свой процесс, только когда все их потоки закончили свою работу. (С потоками POSIX это означает, что main не вернется, пока все другие потоки не будут объединены.) Однако иногда у вас есть несколько потоков, которые выполняют бесконечный цикл, без удержания каких-либо блокировок или чего-либо еще, и есть нет хорошего способа сказать им выйти, когда все остальное сделано; до тех пор, пока выход из процесса из-под них не повредит никакому постоянному состоянию, продолжайте и выходите из процесса из-под них. (Это предполагаемый вариант использования для отсоединенных потоков.) Кроме того, это нормально, и часто это лучший выбор, чтобы внезапно завершить весь процесс, если вы столкнулись с какой-то неисправимой ошибкой. Это единственное исключение, которое я могу придумать из головы.

...