Зависание после вызова функции pthread_cancel (), pthread_join ()

Я написал приложение, которое создает поток и запускает цикл while. В приложении после создания потока я переопределил системный вызов fork() с помощью pthread_atfork(). [когда вызывается fork, вызывается функция prepare, которая отменяет поток, и после того, как дочерний процесс создается, тот же поток создается снова.]

У меня проблема в приведенной выше логике, когда один и тот же код компилируется для другой цели, в pthread_join() происходит зависание.

  1. порождает поток, который запускается в цикле while. (я добавил состояние отмены = включено и тип отмены = асинхронный + также учитываются точки отмены)
  2. заменить fork() на pthread_atfork().
  3. когда выполняется системный вызов fork(), функция подготовки отменяет запущенный поток с помощью pthread_cancel, и применяется pthread_join() для проверки завершения потока.

Здесь возникает проблема, pthread_join() не возвращается. указанное выше поведение наблюдается в одной конкретной целевой среде.

Я немного сомневаюсь

  1. pthread_cancel() безопасно ли звонить?
  2. с состоянием отмены = включено и типом асинхронный, отменяет ли pthread_cancel() поток немедленно?
  3. Или есть альтернативный способ отменить обсуждение?

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

Gil Hamilton 29.11.2018 19:34

Спасибо за ваш ответ. Я отладил программу и заметил, что зависание происходит в pthread.so 2.26 версии glibc. когда то же самое выполняется в pthread.so 2.24 или 2.23, проблема не воспроизводится.

Sachin S Shetty 09.12.2018 10:14

@GilHamilton: Постановка проблемы следующим образом: 1) Основная программа порождает поток, назовите его «Threadrun_Infinite». 2) Вызовите системный вызов pthread_atfork (kill-Threadrun_Infinite, NULL, NULL) В «kill-Threadrun-Infinite» вы отправите pthread_cancel в запущенный поток, т.е. созданный на шаге 1, и выполните pthread_join (), чтобы подтвердить, что поток прекращено. 3) выполните sys_call fork () ->, когда это

Sachin S Shetty 09.12.2018 10:18

@GilHamilton 3) выполнить sys_call fork () -> при выполнении этого системного вызова вызывается предварительная функция kill-Threadrun_infinite. проблема в том, что pthread_cancel успешен, но pthread_join () зависает (это в ожидании мьютекса) .. такое поведение наблюдается в pthread.so 2.26. пожалуйста помоги??

Sachin S Shetty 09.12.2018 10:27

Вы все еще не предоставили минимальный воспроизводимый пример.

Gil Hamilton 09.12.2018 21:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
411
0

Другие вопросы по теме