Здравствуйте, igor-booch, Вы писали:
IB>Блокировка эксклюзивно блокирует два ресурса. IB>Но не два одновременно, а напротив не допускает одновременного захвата обоих ресурсов. IB>Захвачен может быть только один ресурс, либо оба ресурса должны быть свободны. IB>Освобождение захваченного ресурса, происходит при захвате свободного ресурса.
IB>Например, блокировка работает с 2-ми ресурсами A и B.
IB>Предположим захвачен ресурс B IB>При захвате А, освобождается B IB>При освобождении А, B не захватывается, оба ресурса становятся свободными
IB>И наоборот IB>Предположим захвачен ресурс A IB>При захвате B, освобождается A IB>При освобождении B, A не захватывается, оба ресурса становятся свободными
Непонятно. Вы описали поведение только одного потока. Что должен наблюдать второй поток? Предположим, потоком I захвачена блокировка A.
Поток II пытается захватить блокировку B — что получает? Встаёт в ожидании; получает fail; успешно захватывает?
Если встаёт в ожидании, то вам не нужно иметь две блокировки, достаточно одной A+B. Если успешно захватывает, то в вашем коде — баг: как только поток I попробует захватить блокировку B, он встанет в ожидании.
Если поток II попробует вместо освобождения B захватить A, то вы поймаете deadlock.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.