Избегайте тупиковых ситуаций в многопоточном процессе - PullRequest
4 голосов
/ 25 июня 2009

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

Ответы [ 6 ]

9 голосов
/ 25 июня 2009

Пожалуйста, смотрите Каковы общие причины тупиков?

7 голосов
/ 26 июня 2009

Существует четыре условия , которые должны возникнуть для возникновения тупика:

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

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

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

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

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

3 голосов
/ 25 июня 2009

Существует так называемый алгоритм Банкира , для предотвращения тупиковых ситуаций. Также вы можете рассмотреть возможность использования Watch Dog для выхода из тупика. Здесь также мало интересных моментов.

1 голос
/ 25 июня 2009

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

0 голосов
/ 29 июня 2009

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

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

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

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

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

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

0 голосов
/ 25 июня 2009

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

...