Подтвердить что ты не робот

Как избежать взаимоблокировок?

При использовании нескольких потоков разделяемая память должна блокироваться критическими разделами. Однако использование критических секций вызывает возможные взаимоблокировки. Как их можно избежать?

4b9b3361

Ответ 1

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

Ответ 2

Связанный список справа на этой странице содержит несколько ссылок, которые содержат интересную информацию по этой теме.

В дополнение к этому списку есть много других вопросов SO, обсуждающих тему, например

... и многое другое

Ответ 3

Когда я работаю на С++, для меня работает следующее:

  • все общедоступные методы (исключая ctor и dtor) блокировки класса threadafe

  • частные методы не могут вызывать общедоступные методы

Это не общий метод избегания взаимоблокировок.

Ответ 4

Вы должны очень тщательно программировать многопоточные программы. Нет коротких путей, вы должны понимать поток вашей программы, иначе вы обречены.

Ответ 5

Вы можете избежать критических разделов, используя передачу сообщений (синхронные и асинхронные вызовы). При использовании синхронных вызовов вам все равно нужно сделать круговой вызов, в котором поток A задает вопрос B, а B должен задать вопрос, на который можно ответить.

Другой вариант - вместо асинхронных вызовов . Однако получить возвращаемые значения сложнее.

Примечание: Действительно, система передачи сообщений реализована с использованием критической секции, которая блокирует очередь вызовов, но она абстрагируется.

Ответ 6

Среди различных способов ввода критических разделов наиболее популярны семафоры и мьютексы.

  • Семафор - механизм ожидания, а мьютекс - механизм блокировки, ну, понятие в целом сбивает с толку, но, короче говоря, поток, активирующий мьютекс, может дезактивировать его. с этим в виду...

  • Не разрешайте любому процессу блокировать частичное количество ресурсов, если для процесса требуется 5 ресурсов, дождитесь, пока все они будут доступны.

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

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

Если вы не согласны с ps, добавьте комментарии. Я уже закончил gtg, позже добавлю более чистое и понятное объяснение.

Ответ 7

СЛЕДУЮЩИЙ АЛГОРИТМ ИСПОЛЬЗУЕТСЯ, ЧТОБЫ ИЗБЕЖАТЬ СМЕРТИ:

Алгоритм банкиров

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

-Сохраненное состояние

• Операционная система может гарантировать, что все текущие процессы могут завершить свою работу за конечное время

-Настоящее состояние

• Не означает, что система зашла в тупик, но что ОС не может гарантировать, что все текущие процессы могут завершить свою работу за конечное время

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