Что произойдет, если удалить объект с запущенным pthread?

#c #pthreads #delete-operator #pthread-join

#c #pthreads #оператор удаления #pthread-join

Вопрос:

У меня есть объект, который использует pthreads. Его конструктор создает несколько потоков.

Деструктор класса вызывает pthread_join во всех этих потоках.

Что произойдет во время удаления, если этого не произойдет? Т.е. Что произойдет с не завершенным потоком, если оператор delete внезапно попытается освободить объект?

Заранее спасибо за все ответы. 🙂

Комментарии:

1. в лучшем случае программа завершится сбоем. В противном случае он выходит из строя в памяти вашей программы

Ответ №1:

При объединении ваш деструктор будет блокироваться до тех пор, пока все присоединенные потоки не завершатся.

pthread_join

Функция pthread_join() ожидает завершения потока, указанного thread . Если этот поток уже завершен, то функция pthread_join() немедленно возвращает результат. Поток, указанный thread, должен быть объединяемым.

Если вы не присоединитесь к потокам, они продолжат выполняться. Это может иметь различные последствия в зависимости от того, вызываете ли вы неопределенное поведение (например, попробуйте сослаться на удаленный объект после выхода деструктора из одного из все еще запущенных потоков).

Удаление pthread_t объектов может иметь последствия в зависимости от вашей системы (я не знаю каждую реализацию pthreads), но в целом это только ссылки на базовый системный объект, представляющий поток. Таким образом, вы потеряете свою ссылку на этот поток и, возможно, не сможете присоединиться к нему позже, но поток продолжит выполняться.