Выбор ответа Middle Потоки и синхронизация обновлено
Классический дедлок
Вопрос
Поток 1 берёт lock(a), затем lock(b). Поток 2 берёт lock(b), затем lock(a). Как устранить возможный дедлок?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Брать блокировки везде в одном и том же порядке. Дедлок возникает, когда потоки ждут ресурсы друг друга по кругу.
Варианты ответа
- Заменить
lockнаMonitor.Enterбезtry/finally - Брать блокировки везде в одном и том же порядкеправильный ответ
- Сделать оба объекта
aиbполямиvolatile - Увеличить число потоков в пуле через
SetMinThreads
Разбор
Дедлок возникает, когда потоки ждут ресурсы друг друга по кругу. Единый порядок захвата разрывает цикл. Альтернативы: Monitor.TryEnter с таймаутом или укрупнение блокировки. volatile только про видимость, а не про взаимоисключение. Число потоков в пуле на ожидание двух блокировок не влияет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.