Как работает рекурсивный (реентрантный) мьютекс?
Я прочитал две статьи на http://preshing.com/20120305/implementing-a-recursive-mutex а также http://en.wikipedia.org/wiki/Reentrant_mutex о рекурсивном (реентерабельном) мьютексе, но ни одна статья не дала никаких результатов. смысл.
Может ли кто-нибудь объяснить, как работает рекурсивный (реентерабельный) мьютекс?
(Я нашел очень мало материала, объясняющего, как работает рекурсивный мьютекс. Если у кого-то есть ссылка с хорошим объяснением, я бы закрыл этот вопрос.)
Спасибо!
1 ответ
Один простой способ сделать это - соединить стандартный мьютекс со следующей вспомогательной информацией:
- Указатель на поток, которому принадлежит мьютекс (или
NULL
если не приобрел) и - Счетчик, который изначально равен 0.
Затем вы можете получить мьютекс следующим образом:
- Если вы являетесь текущим владельцем мьютекса, увеличьте счетчик и немедленно вернитесь.
- Если нет, приобретите мьютекс и установите счетчик на 0.
Другими словами, если вы уже владеете мьютексом, вы просто увеличиваете счетчик, указывая, что вы теперь владеете им еще больше. Если нет, вы приобретаете мьютекс как обычно.
Затем вы можете освободить мьютекс следующим образом:
- Если счетчик ненулевой, уменьшите счетчик и немедленно вернитесь.
- В противном случае отпустите мьютекс.
Для того чтобы это работало, вы должны иметь возможность считывать счетчик и владелец мьютекса потокобезопасным способом. Вы можете сделать это либо с помощью вторичного мьютекса для его защиты, либо пометив счетчика / владельца volatile
,
Надеюсь это поможет!