2009-06-29 2 views
27

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

+12

Почему downvote? И что еще более важно, почему это закрывается? –

+2

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

+9

Hm. Это звучало как совершенно правильный вопрос для меня, тот, на который мне очень хотелось увидеть ответ. –

ответ

10

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

1

Вы должны запрограммировать многопоточные программы очень осторожно. Там нет короткой вырезки, вы должны должен понять поток вашей программы, иначе вы обречены.

2

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

  1. все открытые методы (за исключением CTOR и dtor) из замка класса поточно

  2. частные методы не могут вызывать публичные методы

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

5

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

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

... and many more

+0

Спасибо, я посмотрю на эти вопросы , –

1

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

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

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

1

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

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

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

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

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

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

0

СЛЕДУЮЩИЙ АЛГОРИТМ используется, чтобы избежать ТУПИК:

Банкира алгоритм

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

-Safe состояние

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

состояние этой опции

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

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

+1

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