Re: Двойная блокировка переключатель
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.09.15 06:28
Оценка: 6 (1) +1
Здравствуйте, 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.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.