Re[3]: Двойная блокировка переключатель
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.09.15 06:01
Оценка: +1
Здравствуйте, igor-booch, Вы писали:

S>>Непонятно. Вы описали поведение только одного потока. Что должен наблюдать второй поток? Предположим, потоком I захвачена блокировка A.

S>>Поток II пытается захватить блокировку B — что получает? Встаёт в ожидании; получает fail; успешно захватывает?
S>>Если встаёт в ожидании, то вам не нужно иметь две блокировки, достаточно одной A+B. Если успешно захватывает, то в вашем коде — баг: как только поток I попробует захватить блокировку B, он встанет в ожидании.
IB>fail. В моем коде все потоки сначала захватывают блокировку А потом B.
Зачем тогда вам вообще такая "двойная блокировка"? Почему вам недостаточно иметь A+B?

S>>Если поток II попробует вместо освобождения B захватить A, то вы поймаете deadlock.

IB>не понял, почему поймаю deadlock?
Потому, что поток II будет стоять в ожидании освобождения A. А оно случится только тогда, когда поток I успешно захватит B, что невозможно, потому что его уже занял поток II.
S>>Предположим, потоком I захвачена блокировка A.
IB>То если поток II пробует захватить A, то он встаёт в ожидание.
IB>Может я неправильно понял смысл "вместо освобождения B". Если их убрать смысл не поменяется. Что значит "вместо"?
Это значит, что в вашей системе у владельца блокировки B возможно всего два действия: либо отпустить B, либо сконвертировать блокировку B в A.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.