При использовании нескольких потоков разделяемая память должна блокироваться критическими разделами. Однако использование критических секций вызывает возможные взаимоблокировки. Как их можно избежать?Как избежать взаимоблокировок?
ответ
Один из способов - использовать иерархию критических секций. Если вы гарантируете, что родительский критический раздел никогда не вводится ни одному из его дочерних элементов, тупиков не может быть. Трудность заключается в обеспечении соблюдения этой иерархии.
Вы должны запрограммировать многопоточные программы очень осторожно. Там нет короткой вырезки, вы должны должен понять поток вашей программы, иначе вы обречены.
Когда я работаю в C++, следующие работы для меня:
все открытые методы (за исключением CTOR и dtor) из замка класса поточно
частные методы не могут вызывать публичные методы
Это не общий метод предотвращения взаимоблокировки.
Связанный лист справа на этой странице содержит несколько ссылок, что дает интересную информацию по этой теме.
В дополнение к этому списку, есть много других SO вопросы обсуждают тему, такие как
... and many more
Спасибо, я посмотрю на эти вопросы , –
Вы можете избежать кри с использованием сообщения, передающего (синхронные и асинхронные вызовы). При использовании синхронных звонков вам все равно нужно сделать круговой вызов, в котором поток A задает вопрос B, а B должен задать вопрос, на который можно ответить.
Другой вариант - сделать асинхронные вызовы . Однако получить возвращаемые значения сложнее.
Примечание: Действительно, система передачи сообщений реализована с использованием критической секции, которая блокирует очередь вызовов, но она абстрагируется.
Среди различных методов ввода критических разделов наиболее популярны семафоры и мьютексы.
Семафор механизм ожидания и мьютекс механизм блокировки, а понятие сбивает с толку больше всего, но в общем, поток активации мьютекс может только отключить его. Имея это в виду...
Не разрешайте любому процессу блокировать частичное количество ресурсов, если для процесса требуется 5 ресурсов, дождитесь, пока все они будут доступны.
- Если вы используете семафор здесь, вы можете разблокировать/отключить ресурс, занятый другим потоком. под этим я подразумеваю, что превенция - еще одна причина.
Эти 2 согласно мне являются основными условиями, остальные 2 из общих 4 мер предосторожности могут быть связаны с ними.
Если вы не согласны с ps, добавьте комментарии. Я уже закончил gtg, позже добавлю более чистое и понятное объяснение.
СЛЕДУЮЩИЙ АЛГОРИТМ используется, чтобы избежать ТУПИК:
Банкира алгоритм
-Impose менее жесткие условия, чем в предотвращении тупиковой в попытке получить более эффективное использование ресурсов
-Safe состояние
• Операционная система может гарантировать, что все текущие процессы могут завершить свою работу за конечное время
состояние этой опции
• Не означает, что система в тупике, но операционная система не может гарантировать, что все текущие процессы могут завершить свою работу за конечное время
-Requires, что ресурсы будут выделены для обрабатывается только тогда, когда распределения приводят к безопасным состояниям. -У него есть ряд недостатков (например, требующих фиксированного количества процессов и ресурсов), которые препятствуют его реализации в реальных системах
Здравствуйте, и добро пожаловать. Вы могли бы опубликовать лучший ответ, объяснив более подробно, что вы сделали. Вы использовали алгоритм? В какой ситуации? Почему вы рекомендуете это в этом случае? –
Почему downvote? И что еще более важно, почему это закрывается? –
сделать это сообщество wiki - прямо сейчас он просто похож на репутацию сельского хозяйства –
Hm. Это звучало как совершенно правильный вопрос для меня, тот, на который мне очень хотелось увидеть ответ. –