Выбор ответа Middle Потоки и синхронизация обновлено

Классический дедлок

Вопрос

Поток 1 берёт lock(a), затем lock(b). Поток 2 берёт lock(b), затем lock(a). Как устранить возможный дедлок?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Брать блокировки везде в одном и том же порядке. Дедлок возникает, когда потоки ждут ресурсы друг друга по кругу.

Варианты ответа

  1. Заменить lock на Monitor.Enter без try/finally
  2. Брать блокировки везде в одном и том же порядкеправильный ответ
  3. Сделать оба объекта a и b полями volatile
  4. Увеличить число потоков в пуле через SetMinThreads

Разбор

Дедлок возникает, когда потоки ждут ресурсы друг друга по кругу. Единый порядок захвата разрывает цикл. Альтернативы: Monitor.TryEnter с таймаутом или укрупнение блокировки. volatile только про видимость, а не про взаимоисключение. Число потоков в пуле на ожидание двух блокировок не влияет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме