На Linux, как убедиться, что разблокировать мьютекс, который был заблокирован в потоке, который умирает / завершается? - PullRequest
4 голосов
/ 08 февраля 2012

Это вопрос интервью.

В linux, как убедиться, что разблокирован мьютекс POSIX, который был заблокирован в потоке POSIX, который умирает / завершается?

Моя идея:

Linux выпустит его автоматически, когда отправит в программу сигнал уничтожения или завершения? Но я не могу найти более подробную информацию о том, как ОС делает это?

спасибо

Ответы [ 2 ]

13 голосов
/ 09 февраля 2012

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

Надежный мьютекс - это мьютекс с установленным атрибутом робастности.В Linux это можно установить с помощью pthread_mutexattr_setrobust_np(&attr, PTHREAD_MUTEX_ROBUST_NP) или с помощью стандартной функции POSIX pthread_mutexattr_setrobust(&attr, PTHREAD_MUTEX_ROBUST), если у вас glibc 2.12 или более поздняя версия (эта функция была стандартизирована в POSIX.1-2008).

3 голосов
/ 08 февраля 2012

Если это не мьютекс, разделяемый процессом, это не имеет значения. Когда один поток умирает, процесс умирает, и мьютекс исчезает.

Если это мьютекс с общим процессом, вы задаете не тот вопрос. Вы бы не хотели хотеть разблокировать мьютекс, если при его удержании поток умер. Причина, по которой поток имеет мьютекс, заключается в том, что он может манипулировать общими данными через состояния, которые не должны быть видны другим потокам. Если поток умирает, удерживая мьютекс, вполне вероятно, что данные остались в таком несовместимом состоянии. Разблокировка мьютекса позволит другим потокам видеть недействительные / поврежденные данные.

...