#c #pthreads #delete-operator #pthread-join
#c #pthreads #оператор удаления #pthread-join
Вопрос:
У меня есть объект, который использует pthreads. Его конструктор создает несколько потоков.
Деструктор класса вызывает pthread_join во всех этих потоках.
Что произойдет во время удаления, если этого не произойдет? Т.е. Что произойдет с не завершенным потоком, если оператор delete внезапно попытается освободить объект?
Заранее спасибо за все ответы. 🙂
Комментарии:
1. в лучшем случае программа завершится сбоем. В противном случае он выходит из строя в памяти вашей программы
Ответ №1:
При объединении ваш деструктор будет блокироваться до тех пор, пока все присоединенные потоки не завершатся.
Функция pthread_join() ожидает завершения потока, указанного thread . Если этот поток уже завершен, то функция pthread_join() немедленно возвращает результат. Поток, указанный thread, должен быть объединяемым.
Если вы не присоединитесь к потокам, они продолжат выполняться. Это может иметь различные последствия в зависимости от того, вызываете ли вы неопределенное поведение (например, попробуйте сослаться на удаленный объект после выхода деструктора из одного из все еще запущенных потоков).
Удаление pthread_t
объектов может иметь последствия в зависимости от вашей системы (я не знаю каждую реализацию pthreads), но в целом это только ссылки на базовый системный объект, представляющий поток. Таким образом, вы потеряете свою ссылку на этот поток и, возможно, не сможете присоединиться к нему позже, но поток продолжит выполняться.