При использовании нескольких потоков разделяемая память должна блокироваться критическими разделами. Однако использование критических секций вызывает возможные взаимоблокировки. Как их можно избежать?
Как избежать взаимоблокировок?
Ответ 1
Один из способов - использовать иерархию критических разделов. Если вы гарантируете, что родительский критический раздел никогда не вводится ни одному из его дочерних элементов, тупиков не может быть. Трудность заключается в обеспечении соблюдения этой иерархии.
Ответ 2
Связанный список справа на этой странице содержит несколько ссылок, которые содержат интересную информацию по этой теме.
В дополнение к этому списку есть много других вопросов SO, обсуждающих тему, например
- Рекомендации по использованию Threading
- Почему блокировка (это) {...} плохая?
- Каковы распространенные причины взаимоблокировок?
... и многое другое
Ответ 3
Когда я работаю на С++, для меня работает следующее:
-
все общедоступные методы (исключая ctor и dtor) блокировки класса threadafe
-
частные методы не могут вызывать общедоступные методы
Это не общий метод избегания взаимоблокировок.
Ответ 4
Вы должны очень тщательно программировать многопоточные программы. Нет коротких путей, вы должны понимать поток вашей программы, иначе вы обречены.
Ответ 5
Вы можете избежать критических разделов, используя передачу сообщений (синхронные и асинхронные вызовы). При использовании синхронных вызовов вам все равно нужно сделать круговой вызов, в котором поток A задает вопрос B, а B должен задать вопрос, на который можно ответить.
Другой вариант - вместо асинхронных вызовов . Однако получить возвращаемые значения сложнее.
Примечание: Действительно, система передачи сообщений реализована с использованием критической секции, которая блокирует очередь вызовов, но она абстрагируется.
Ответ 6
Среди различных способов ввода критических разделов наиболее популярны семафоры и мьютексы.
-
Семафор - механизм ожидания, а мьютекс - механизм блокировки, ну, понятие в целом сбивает с толку, но, короче говоря, поток, активирующий мьютекс, может дезактивировать его. с этим в виду...
-
Не разрешайте любому процессу блокировать частичное количество ресурсов, если для процесса требуется 5 ресурсов, дождитесь, пока все они будут доступны.
- Если вы используете семафор здесь, вы можете разблокировать/отключить ресурс, занятый другим потоком. под этим я подразумеваю, что превенция - еще одна причина.
Эти 2 по мне являются основными условиями, остальные 2 из общих 4 мер предосторожности могут быть связаны с ними.
Если вы не согласны с ps, добавьте комментарии. Я уже закончил gtg, позже добавлю более чистое и понятное объяснение.
Ответ 7
СЛЕДУЮЩИЙ АЛГОРИТМ ИСПОЛЬЗУЕТСЯ, ЧТОБЫ ИЗБЕЖАТЬ СМЕРТИ:
Алгоритм банкиров
- Используйте менее строгие условия, чем предотвращение тупиковой ситуации, чтобы повысить эффективность использования ресурсов.
-Сохраненное состояние
• Операционная система может гарантировать, что все текущие процессы могут завершить свою работу за конечное время
-Настоящее состояние
• Не означает, что система зашла в тупик, но что ОС не может гарантировать, что все текущие процессы могут завершить свою работу за конечное время
-Requires, чтобы ресурсы были распределены для процессов только тогда, когда распределения приводят к безопасным состояниям. -У него есть ряд недостатков (например, требующих фиксированного количества процессов и ресурсов), которые препятствуют его реализации в реальных системах