2009-06-25 5 views
4

Каковы лучшие практики/идиомы, которым следует следовать, чтобы избежать взаимоблокировок?Избегайте взаимоблокировок в многопоточном процессе

+0

Возможный дубликат [Каковы распространенные причины взаимоблокировок?] (Http://stackoverflow.com/questions/528303/what-are-common-reasons-for-deadlock) –

ответ

1

Канонический метод для избежания тупиковой, чтобы иметь иерархию блокировки. Убедитесь, что все потоки получают блокировки или другие ресурсы в том же порядке. Это позволяет избежать сценария взаимоблокировки, когда поток 1 удерживает блокировку A и требует блокировки B, в то время как поток 2 удерживает блокировку B и требует блокировки A. С иерархией блокировки оба потока должны были бы получить блокировки в том же порядке (например, A до B) ,

1

Существует так называемый Banker's algorithm, для предотвращения взаимоблокировки. Также вы можете рассмотреть использование Watch Dog, чтобы вырваться из тупика. Here также мало интересных точек.

+0

Почему нет Upvote для этой сущности! – 8090PZ

0

Лучшей практикой было бы определение класса для вашего потока и использование только нестатических полей этого класса в вашем потоке, чтобы ваши потоки не делили память.
Конечно, во избежание тупиков вы также можете избежать использования семафоров, критических секций и мьютексов. Меньше, если вы хотите избежать тупиков. К сожалению, они требуются, если какая-либо память или другой ресурс разделяется между двумя потоками, иначе вы рискуете повреждением данных.

6

Есть four conditions, которые должны произойти в тупике произойти:

  1. Взаимное условие исключения: ресурс, который не может быть использован более чем одним процессом, в то время

  2. Удержание и ждать условие: процессы, которые уже имеют ресурсы, могут запрашивать новые ресурсы

  3. Отсутствие условия превенции: ни один ресурс не может быть принудительно удален из процесса, удерживающего его, ресурсы могут быть освобождены только посредством e Xplicit действие процесса

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

Избегайте по крайней мере один из них , и желательно больше, и у вас не должно быть слишком много проблем.

-1

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

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

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

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

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

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

Смежные вопросы