2016-12-01 4 views
0

Я использую общую библиотеку, которая создает рабочие потоки во время инициализации. Приложение связано с uClibc. Когда он возвращается из main(), он сбой в __pthread_cond_wait() или аналогичный из рабочего потока, что общая библиотека не останавливается должным образом из своего кода cleanup(). Основной() стек потока, когда он выходит из строя является:uClibc shared libs разгрузка во время выхода()

#0 _dl_munmap from uClibc.so 
#1 _dl_fini 
#2 __GI_exit 
#3 __uClibc_main 

Поскольку у меня нет источника для общей библиотеки я не могу исправить очищающий код уборщицы, но мой вопрос:

Почему потоки все еще работают (сбой), как только uClibc начинает выгружать общие библиотеки? Я предполагаю, что он выгружает их из записи стека _dl_munmap выше. Есть ли способ убедиться, что все потоки приостановлены/остановлены при выходе из main()?

ответ

1

Почему потоки выполняющихся

Поскольку вы (или совместно используемые библиотеки, вы связываете с) оставил их работу.

Есть ли способ, чтобы убедиться, что все потоки приостановлены/остановлены, когда основной() выходит

Да: вам нужно организовать для потоков прекратить. Без доступа к источнику разделяемой библиотеки вы не можете этого сделать; ваш единственный выбор - позвонить _exit (который не должен запускать очистку) вместо exit (или вместо возврата от main).

+0

Могу ли я предположить, что поведение posix в том, что потоки все еще могут выполняться, а libc - это munmap() 'shared libs at exit? – patraulea

Смежные вопросы