2012-08-05 2 views
2

Существуют ли какие-либо распространенные практики или правила, чтобы избежать взаимоблокировки в программе? Также есть ли поддержка от CLR или любого инструмента из языка/структуры для обработки такого сценария?Как избежать тупика в .NET

+6

Учитывается ли «блокировка вещей в последовательном порядке»? –

+1

Очень сложно удержаться от ответа «просто избегайте нарезания резьбы». –

+0

Извините за неправильную формулировку, я просто хочу знать, могу ли я следовать некоторым правилам, чтобы избежать таких проблем (например, не блокировать это). – user854301

ответ

1

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

Это может помочь вам

http://msdn.microsoft.com/en-us/library/hw29w7t1(v=vs.71).aspx

+3

Я не вижу, чтобы какие-то изменения в какой-то мере меняли проблему; это идентичная проблема, но с управляемыми ОС управляющими примитивами. Вы можете так же взаимоблокировать с помощью мьютекса/семафора. –

+0

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

12

Обратите внимание, что мало это .net специфический:

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

Один простой способ достичь этого: попытаться использовать только один объект блокировки за раз; поэтому вместо блокировки A и B вы блокируете (отдельно) A , затем B. Это тоже требует мысли и планирования, но обычно это достижимо.

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

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

+0

Я ценю ваш ответ. – user854301

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