Выполняет ли процесс автоматическую очистку ресурсов, полученных pthreads при выходе

Предположим, что у меня есть код примерно так:

void *my_thread(void *data) { while (1) { } } void foo_init(struct my_resource *res) { pthread_create(&res->tid, NULL, my_thread, res); /* Some init code */ } void foo_exit(void) { /* Some exit code */ } 

Сценарий выглядит примерно так. Когда процесс инициализируется, функция foo_init() вызывается с указателем на мои выделенные ресурсы (выделение выполняется автоматически другой функцией, которая не находится под моим контролем). Внутри функции я создаю pthread , который работает в бесконечном цикле.

Через некоторое время, когда процесс вот-вот завершится, foo_exit() функция foo_exit() , но на этот раз без указателя на мои ресурсы, и, следовательно, я не могу вызвать pthread_join() , так как мой tid содержится в структуре my_resource .

Теперь мой вопрос заключается в том, что уничтожаются ли ресурсы, относящиеся к pthreads , после завершения процесса ОС или нет? Если да, как я могу это сделать.

Также безопасно ли завершить процесс без вызова pthread_join() ?

Заранее спасибо.

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

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

Короткий ответ, если ОС не очищается после процесса, это ошибка в ОС. Но никто из нас не пишет багги программного обеспечения?

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

Например, если ваш процесс разговаривает с деmonoм или с другим процессом, таким как диспетчер окон и выделяет ресурсы, независимо от того, выпущены ли они или нет, если процесс завершается без их освобождения, зависит от реализации.

Я думаю, что на вопрос можно ответить другим способом: pthreads не владеет никакими ресурсами, ресурсы принадлежат процессу. (Pthread может быть «хранителем» ресурсов, таких как память, которую он имеет malloc’ed, но он не является владельцем.) Когда процесс завершается, все еще запущенные pthreads внезапно останавливаются, а затем происходит обычная очистка процесса.

POSIX говорит (для _Exit() ):

• Нити, завершенные вызовом _Exit () или _exit (), не должны вызывать обработчики очистки отмены или деструкторы данных для streamов.

Для exit() POSIX указывает немного большую очистку – в частности, все вещи atexit() и streamи очистки и т. Д. – перед тем как продолжить, используя _Exit() . Обратите внимание, что это не вызывает никакой очистки отмены pthread для любого pthread – система не может определить, в каком состоянии находится какой-либо pthread, и не может быть уверен в возможности pthread_cancel() всех pthreads, так что единственное, что он может сделать, чтобы остановить их всех мертвых.

Я могу порекомендовать Single UNIX® Specification (POSIX) – как и любой стандарт, это нелегко прочитать, но стоит узнать.