Когда это происходит? Поток приостановлен в критической секции - PullRequest
3 голосов
/ 03 марта 2010

Мне просто интересно, если поток находится в критическом разделе, может ли он быть вытеснен?

  • Тема A : введите CR
  • Тема A : Получить приостановлено
  • Тема B : хочет ввести CR, но не может, потому что Тема A имеет блокировку

Если Поток A выгружен, и поэтому блокировка мьютекса застряла с Потоком A , что можно сделать с этим?

Ответы [ 2 ]

6 голосов
/ 03 марта 2010

Предположим, что поток A вытеснен потоком с более высоким приоритетом C. Теперь предположим, что поток B на самом деле имеет более высокий приоритет, чем C. Если B становится работоспособным, у вас есть классический случай инверсии приоритетов; Поток B (высокий приоритет) застрял в ожидании ресурса, удерживаемого потоком A (низкий приоритет). Одно из лекарств от этого называется приоритетным наследованием.

При наследовании приоритета, когда B блокирует ресурс, удерживаемый A (критическая секция), поток A временно «наследует» приоритет потока B. Это позволяет A выгружать этот надоедливый поток со средним приоритетом C, а когда сделано с ресурсом, А возвращается к своему первоначальному приоритету. Это, так сказать, убирает А с пути В., устраняя тупик.

5 голосов
/ 03 марта 2010

Конечно, это может быть прервано. Иначе как другие потоки могут попытаться войти в этот критический раздел, если единственный поток, которому разрешено работать в этом процессе, - это поток, которому принадлежит критический раздел?

Поток B в вашем примере будет ждать, пока поток A не будет перенесен и завершен с критическим сечением. Здесь нет ничего удивительного. И если поток A, находясь в критической секции, также ожидает мьютекс, принадлежащий thead B, то это тупик, который вы должны устранить, пересмотрев свою логику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...