Выход из потока POSIX / сбой / исключение-сбой при удерживании мьютекса - PullRequest
5 голосов
/ 08 сентября 2011

Существует ли четко определенное поведение для владения мьютексом POSIX в случае

  1. Выход из потока
  2. Сбой потока
  3. Сбой потока из-за исключения

Предположим, что thread-1 владеет мьютексом.И поток-2 ждет, чтобы получить тот же мьютекс.И поток-1 идет сценарий 1/2/3.Как это влияет на нить-2?

PS: Я считаю, что поведение для спин-блокировки, а не для разблокировки нити-2, с учетом того, что секция, защищенная с помощью спин-блокировки, в любом случае находится в плохой форме.

Ответы [ 2 ]

7 голосов
/ 08 сентября 2011

Если вы беспокоитесь об этих проблемах, Надежные мьютексы могут быть тем инструментом, который вы ищете:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_setrobust.html

После темы, которой принадлежитнадежный мьютекс завершается без его разблокировки, следующий поток, который попытается заблокировать его, получит EOWNERDEAD и станет новым владельцем.Это сигнализирует о том, что он отвечает за очистку состояния, которое защищает мьютекс, и снова маркирует его в соответствии с функцией pthread_mutex_consistent, прежде чем разблокировать его.Разблокировка, не помечая ее как непротиворечивую, переводит мьютекс в состояние, которое невозможно восстановить.

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

1 голос
/ 08 сентября 2011

Это действительно просто.Если вы явно не разблокируете мьютекс, он останется заблокированным, независимо от того, что произошло и почему.Это c, а не ruby ​​на рельсах или visual basic.

...