Здравствуйте, 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.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.