Стратегии и методы блокировки для предотвращения взаимоблокировок в коде

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

Например, данные потоки T1 и Т2, где T1 обращается к ресурсу A, а затем B и T2 обращаются к ресурсу B и затем A. Блокировка ресурсов в том порядке, в котором они необходимы, вызывает тупиковую блокировку. Простое решение - заблокировать A, а затем заблокировать B, независимо от того, в каком порядке поток будет использовать ресурсы.

Проблемная ситуация:

Thread1                         Thread2
-------                         -------
Lock Resource A                 Lock Resource B
 Do Resource A thing...          Do Resource B thing...
Lock Resource B                 Lock Resource A
 Do Resource B thing...          Do Resource A thing...

Возможное решение:

Thread1                         Thread2
-------                         -------
Lock Resource A                 Lock Resource A
Lock Resource B                 Lock Resource B
 Do Resource A thing...          Do Resource B thing...
 Do Resource B thing...          Do Resource A thing...

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

29
задан Xander Tulip 19 May 2011 в 08:07
поделиться