Jump to content

Реентерабельный мьютекс

В информатике возвратный мьютекс ( рекурсивный мьютекс , рекурсивная блокировка ) — это особый тип устройства взаимного исключения (мьютекса), которое может блокироваться несколько раз одним и тем же процессом/потоком , не вызывая взаимоблокировки .

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

Мотивация

[ редактировать ]

Рекурсивные мьютексы решают проблему отсутствия повторного входа в обычные мьютексы: если функция, которая принимает блокировку и выполняет обратный вызов, сама вызывается обратным вызовом, возникает взаимоблокировка . [1] В псевдокоде это следующая ситуация:

var m : Mutex  // A non-recursive mutex, initially unlocked.

function lock_and_call(i : Integer)
    m.lock()
    callback(i)
    m.unlock()

function callback(i : Integer)
    if i > 0
        lock_and_call(i - 1)

lock_and_call(1)  // Invoking the function

Учитывая эти определения, вызов функции lock_and_call(1) вызовет следующую последовательность событий:

  • m.lock() — мьютекс заблокирован
  • обратный вызов(1)
  • lock_and_call(0) — потому что я > 0
  • m.lock() — тупик, потому что m уже заблокирован, поэтому исполняющий поток заблокируется, ожидая себя.

Замена мьютекса на рекурсивный решает проблему, потому что финальный m.lock() завершится успешно без блокировки.

Практическое использование

[ редактировать ]

У. Ричард Стивенс отмечает, что рекурсивные блокировки «сложно» использовать правильно, и рекомендует их использовать для адаптации однопоточного кода без изменения API , но «только тогда, когда другое решение невозможно». [2]

Monitor Собственный механизм синхронизации языка Java, , использует рекурсивные блокировки. Синтаксически блокировка — это блок кода, перед которым стоит ключевое слово «synchronized», а также любая ссылка на объект в круглых скобках, которая будет использоваться в качестве мьютекса. Внутри синхронизированного блока данный объект можно использовать в качестве условной переменной, выполнив для него функции wait(), notify() или notifyAll(). Таким образом, все объекты являются как рекурсивными мьютексами, так и условными переменными . [3]

  1. Поток A вызывает функцию F, которая получает для себя повторную блокировку, прежде чем продолжить.
  2. Поток B вызывает функцию F, которая пытается получить для себя повторную блокировку, но не может из-за того, что одна из них уже ожидающая, что приводит либо к блокировке (она ждет), либо к тайм-ауту, если это запрошено.
  3. Поток F вызывает себя рекурсивно. Ему уже принадлежит блокировка, поэтому он не заблокируется (нет взаимоблокировки). Это основная идея возвратного мьютекса, и именно это отличает его от обычной блокировки.
  4. Поток B все еще ожидает или поймал тайм-аут и обошел его.
  5. Поток F завершает работу и освобождает свои блокировки.
  6. Поток B F теперь может получить повторную блокировку и продолжить работу, если он все еще ожидает

Программная эмуляция

[ редактировать ]

Программная эмуляция может быть выполнена [ нужны разъяснения ] используя следующую структуру: [ нужна ссылка ]

  • «контроля» Условие с использованием обычного замка
  • Идентификатор владельца, уникальный для каждого потока (по умолчанию пустой/не установлен)
  • Количество приобретений (по умолчанию равно нулю)

Приобретение

[ редактировать ]
  1. Получите условие управления.
  2. Если установлен владелец, а не текущий поток, дождитесь уведомления об условии управления (это также отменяет условие).
  3. Установите владельца текущего потока. Идентификатор владельца на этом этапе уже должен быть очищен, если только покупатель еще не является владельцем.
  4. Увеличьте количество приобретений (для новых владельцев всегда должно быть 1).
  5. Отмените условие управления.

Выпускать

[ редактировать ]
  1. Получите условие управления, утверждающее, что владелец является выпускающим.
  2. Уменьшите счетчик захватов, утверждая, что счетчик больше или равен нулю.
  3. Если счетчик захватов равен нулю, очистите информацию о владельце и уведомите условие управления.
  4. Отмените условие управления.
  1. ^ Бушманн, Франк; Хенни, Кевлин; Шмидт, Дуглас К. (2007). Архитектура программного обеспечения, ориентированная на шаблоны, язык шаблонов для распределенных вычислений . Джон Уайли и сыновья. п. 374. ИСБН  9780470065303 .
  2. ^ Стивенс, В. Ричард; Раго, Стивен А. (2013). Расширенное программирование в среде UNIX . Аддисон-Уэсли. п. 434.
  3. ^ Дэвид Ховмейер. «Лекция 17: Java-потоки, синхронизация» . CS 365 — Параллельные и распределенные вычисления . Проверено 4 июня 2015 г. {{cite book}}: |work= игнорируется ( помогите )
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: d020bb7aa5deec27f62d18b2ebd93ced__1630039200
URL1:https://arc.ask3.ru/arc/aa/d0/ed/d020bb7aa5deec27f62d18b2ebd93ced.html
Заголовок, (Title) документа по адресу, URL1:
Reentrant mutex - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)