Вызывает ли отмена потока, находящегося в pthread_cond_wait, перезапуск соответствующего мьютекса? - PullRequest
2 голосов
/ 24 января 2012

Я смотрю на код в учебнике: Программирование с использованием потоков POSIX Дэвида Р. Бутенхофа, и я наткнулся на место, которое немного смущает меня.

В коде обработчик очистки зарегистрирован для потока. Обработчик очистки разблокирует мьютекс, который используется условием в этом потоке.

В потоках в genereal, когда вызывается pthread_cond_wait (с соответствующим мьютексом, заблокированным, как и должно быть), мьютекс разблокируется, пока поток ожидает, - затем он повторно запрашивается, когда условие ожидания закончено, прежде чем он возвращается (т.е. произошел сигнал или трансляция).

Поскольку во время ожидания условие_свит не блокирует мьютекс, я бы подумал, что если бы поток был отменен во время ожидания, он все равно не заблокировал бы этот мьютекс - так зачем обработчику очистки его освобождать?

На самом деле, я думал, что разблокировка мьютекса, который уже был разблокирован, на самом деле была ошибкой, что ухудшало ситуацию. Может кто-нибудь сказать мне, где вы думаете, что я в замешательстве?

1 Ответ

3 голосов
/ 24 января 2012

Вы правы в отношении разблокировки мьютекса, который уже разблокирован как «Плохая вещь».

Однако, хотя pthread_cond_wait() является точкой отмены, интерфейс гарантирует, что мьютекс будет повторно получен до запуска обработчика отмены. Если бы он не дал этой гарантии, было бы очень трудно узнать, был ли удержан мьютекс.

См .: Спецификация для деталей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...