Каковы Повторно используемая блокировка и понятие в целом?

Короткий ответ, потому что Microsoft заявила так. Более длинный ответ - то, что Microsoft обеспечила механизм для расширения запечатанных классов, методов вызываемого внутреннего абонента.

В целом, это - плохая идея расширить классы который, к которому у Вас нет исходного кода. Например, Вы не знаете то, что вызов базового метода делает к внутренним данным объекта. Да, можно использовать отражатель или безотносительно понимать это, но в целом намного лучше использовать состав или дополнительные методы.

также необходимо рассмотреть, каково наследование на самом деле. Это не просто способ изменить класс, это также обеспечивает полиморфизм. Что при изменении семантики, скажем, строкового класса, затем Вы передаете свой новый строковый класс объекту, который ожидает, что строка будет действовать в особенном методе? изолированный по существу осуществляет контракт, что этот объект будет всегда работать способ, к которому Вы ожидаете это.

81
задан Ciro Santilli 新疆改造中心法轮功六四事件 15 December 2015 в 13:40
поделиться

2 ответа

Блокировка с повторным входом

Блокировка с повторным входом - это блокировка, при которой процесс может требовать блокировку несколько раз без блокировки самого себя. Это полезно в ситуациях, когда нелегко отследить, захватили ли вы блокировку. Если блокировка не повторяется, вы можете захватить блокировку, а затем заблокировать ее, когда вы пойдете, чтобы захватить ее снова, эффективно блокируя ваш собственный процесс.

Повторная входимость в целом - это свойство кода, у которого нет центрального изменяемого состояния, которое могло бы быть поврежденным, если код был вызван во время выполнения. Такой вызов может быть выполнен другим потоком, или он может быть выполнен рекурсивно путем выполнения, исходящего из самого кода.

Если код полагается на общее состояние, которое может быть обновлено в середине его выполнения, это не возвращающийся, по крайней мере, если это обновление может сломать его.

Вариант использования блокировки повторного входа

Пример (несколько общий и надуманный) приложения для блокировки повторного входа может быть следующим:

  • У вас есть некоторые вычисления с использованием алгоритма, который пересекает граф (возможно, с циклами в нем). Обход может посещать один и тот же узел более одного раза из-за циклов или из-за нескольких путей к одному и тому же узлу.

  • Структура данных подлежит одновременному доступу и может быть обновлена ​​по какой-либо причине, возможно, другим потоком. Вы должны иметь возможность блокировать отдельные узлы, чтобы иметь дело с потенциальным повреждением данных из-за состояния гонки. По какой-то причине (возможно, из-за производительности) вы не хотите глобально блокировать всю структуру данных.

  • Вы вычисления не можете сохранить полную информацию о том, какие узлы вы посетили, или вы используете структуру данных, которая не ' не позволяю ' был ли я здесь раньше », на вопросы, на которые нужно быстро ответить.

    Примером этой ситуации может служить простая реализация алгоритма Дейкстры с приоритетной очередью, реализованной как двоичная куча, или поиск в ширину с использованием простого связанного списка в качестве очередь. В этих случаях сканирование очереди на наличие существующих вставок выполняется за O (N), и вы можете не захотеть делать это на каждой итерации.

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

Повторно входящие мьютексы

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

IIRC API потоков POSIX действительно предлагает возможность повторного и невозвратного мьютексов.

143
ответ дан 24 November 2019 в 09:34
поделиться

Блокировка повторного входа позволяет вам написать метод M , который блокирует ресурс A , а затем вызывает M рекурсивно или из кода, который уже блокирует A .

При блокировке без повторного входа вам потребуются 2 версии M , одна блокирующая, а другая нет, а также дополнительная логика для вызова нужной.

20
ответ дан 24 November 2019 в 09:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: