Я написал приложение, которое создает поток и запускает цикл while.
В приложении после создания потока я переопределил системный вызов fork() с помощью pthread_atfork().
[когда вызывается fork, вызывается функция prepare, которая отменяет поток, и после того, как дочерний процесс создается, тот же поток создается снова.]
У меня проблема в приведенной выше логике, когда один и тот же код компилируется для другой цели, в pthread_join() происходит зависание.
fork() на pthread_atfork().fork(), функция подготовки отменяет запущенный поток с помощью pthread_cancel, и применяется pthread_join() для проверки завершения потока.Здесь возникает проблема, pthread_join() не возвращается.
указанное выше поведение наблюдается в одной конкретной целевой среде.
Я немного сомневаюсь
pthread_cancel() безопасно ли звонить?pthread_cancel() поток немедленно?Спасибо за ваш ответ. Я отладил программу и заметил, что зависание происходит в pthread.so 2.26 версии glibc. когда то же самое выполняется в pthread.so 2.24 или 2.23, проблема не воспроизводится.
@GilHamilton: Постановка проблемы следующим образом: 1) Основная программа порождает поток, назовите его «Threadrun_Infinite». 2) Вызовите системный вызов pthread_atfork (kill-Threadrun_Infinite, NULL, NULL) В «kill-Threadrun-Infinite» вы отправите pthread_cancel в запущенный поток, т.е. созданный на шаге 1, и выполните pthread_join (), чтобы подтвердить, что поток прекращено. 3) выполните sys_call fork () ->, когда это
@GilHamilton 3) выполнить sys_call fork () -> при выполнении этого системного вызова вызывается предварительная функция kill-Threadrun_infinite. проблема в том, что pthread_cancel успешен, но pthread_join () зависает (это в ожидании мьютекса) .. такое поведение наблюдается в pthread.so 2.26. пожалуйста помоги??
Вы все еще не предоставили минимальный воспроизводимый пример.





Лучше всего предоставить минимальный воспроизводимый пример. Немного сложно точно следить за тем, что вы делаете, и поэтому угадывать, что может пойти не так, не видя своего кода.