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

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

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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

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

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

Ответ 7

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

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

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

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

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

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

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

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