thread_cancel и блокирующая функция как cond_wait

У меня есть мой основной процесс отправки pthread_cancel в другой поток, который ожидает, что условие произойдет с cond_wait(&condition), На pthread_cancel они говорят: Отложенная возможность отмены означает, что отмена будет отложена до следующего вызова потока функцией, которая является точкой отмены. Но часто эти функции блокируют функцию. Тогда мой вопрос — отменена ли нить только после того, как эта нить была разблокирована (в моем примере широковещательной рассылкой или сигналом), или она увидит, что я в данный момент блокирую точку отмены, а затем отменила мою нить?

0

Решение

Я не знаком с cond_wait, но я предполагаю, что это из другой библиотеки, чем обычно используется pthread_cond_wait?

Но да, если поток заблокирован в pthread_cond_wait и затем отменен, поток будет разбужен, повторно получит его мьютекс, а затем будет отменен.

Таким образом, при отмене потоков, заблокированных по условию, необходимо учитывать два важных момента:

  1. Убедитесь, что мьютекс разблокирован (или будет разблокирован в какой-то момент в будущем), перед вызовом pthread_cancel, Например, если поток A ожидает условия, а поток B блокирует мьютекс условия, он вызывает pthread_cancel а потом pthread_join перед разблокировкой условия мьютекс вы будете в тупике.

  2. Установите обработчик очистки (см. pthread_cleanup_push) чтобы разблокировать мьютекс вашего состояния перед вызовом pthread_cond_wait — иначе вы отмените свою ветку и оставите мьютекс заблокированным.

Тем не менее, обратите внимание также, что реализация переменной условия pthread имела / имеет некоторые ошибки — поэтому обязательно используйте обновленный glibc.

0

Другие решения

Возможно, вы захотите использовать pthread_cond_wait вместо cond_wait.

Если вы используете pthread_cond_wait и основываясь на этом от man pthread_cond_wait (3)

Ожидание условия (будь то по времени или нет) является точкой отмены. Когда состояние разрешения отмены потока установлено в PTHREAD_CANCEL_DEFERRED, побочным эффектом воздействия на запрос отмены во время ожидания условия является то, что мьютекс (фактически) повторно получается перед вызовом первого обработчика очистки отмены. Эффект такой, как если бы поток был разблокирован, ему было разрешено выполнение вплоть до момента возврата из вызова pthread_cond_timedwait () или pthread_cond_wait (), но в этот момент он замечает запрос на отмену и вместо возврата к вызывающей функции pthread_cond_timedwait () или pthread_cond_wait (), запускает действия по отмене потока, которые включают в себя вызов обработчиков очистки отмены.

Похоже, что поток отменит на pthread_cond_wait, даже если он в настоящее время заблокирован

Или вы можете установить тип отмены с помощью pthread_setcanceltype в ASYNCHRONOUS. см. комментарий ниже

Но, как и в большинстве случаев, лучший способ узнать наверняка — попробовать это с помощью тестового кода.

0

А ты уже прошел курс программирования? Супер скидка!
Прокачать скилл $$$
×