LINUX.ORG.RU

Что будет, если вызвать exit() или _exit() в дочернем треде?


0

0

Имеется ввиду pthreads.

Я нахожусь в каком-то треде - дочернем, там вызываю exit(), или _exit(), и моя прога подвисает, ожидая чего-то (вопрос номер один - чего она может ожидать?) Если вместо exit()/_exit() вызвать abort(), программа послушно абортается.

Если перед exit()/_exit() попытаться вызвать pthread_kill_other_threads(), результат тот же, до exit()/_exit() вообще не добираемся, ждем-с.

Кто бы подсказал, если кто имел дело с таким поведение, в чем тут может быть дело, и как можно бороться, а?

Заранее премного благодарен.


а зачем вызывать exit, если есть pthread_exit() ?
А что она ожидает, врядли поймешь....
У меня к примеру на SuSE 8.0 сразу же вся прога завершится, на РХ 8.0 стоит другая версия pthreads, поэтому может завершится по другому.

В общем все зависит от версии libpthreads.

Dead ★★★★
()

Ну ладно, тогда уточнение: мне просто нужно немедленно, но корректно, с нулевым кодом возврата завершить программу. Можно ли это сделать, находясь в дочернем треде? Моя версия 0.10, но это, по-моему, не важно в данном случае.

J_e_k
() автор топика

Согласно POSIX вызов exit приведет к завершению всей программы. Под линухом это почти справедливо, поскольку по опыту могу сказать - если тред висит на блокировке в сисколе то вероятно он не вылетит...

Рекомендую попробовать;)

Я делал через kill_other_thread_np (не помню точно как именно) + exit - работало на ура.

tvn
()

Нда, ну вот, в других тредах у меня в это время select сосет пайпы. Видимо, траблы отсюда. Но - как я уже писал, - kill_other_threads_np не канает :(((( Может быть, попробовать вручную закилять другие треды сигналом, скажем, SIGTERM? Сейчас попробую :)

J_e_k
() автор топика

Наверное работаеш с NPTL? Попробуй pthread_cancel(), естественно, не забудь разрешить cancelation... Если и такое не сработает - пиши баг репорт...

Удачи!

tvn
()

Она ожидает одного, чтобы ты получил от умирающего процесса последнее, что он хочет сказать... Инфу о затраченых ревурсах, все такое. Сделать это можно фу-цией pthread_join, либо задать ему атрибут PTHREAD_CREATE_DETACHED

OxiD ★★★★
()
Ответ на: комментарий от OxiD

Если речь идет о завершении нити то да все правильно, но если завершаем весь процес о каком pthread_join может идти речь? Я что должен его ставить перед каждым exit в своей программе? ;)))

Удачи!

tvn
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.