2017-02-21 5 views
0

Контекст как это:Как поток, ожидающий mutex, возвращается к запуску?

  • поток пытается заблокировать уже запертой MUTEX
  • нить усыплять/блокировка
  • через некоторое время, то мьютекс разблокируется

Q1) Что будет потом?

Будет ли резьба немедленно возвращена в исходное положение? Или ядро ​​по-прежнему будет ждать, пока работающий поток будет потреблять свой временной срез и как обычно планировать ожидающий поток?

Q2) Что делать, если мьютекс не разблокирован навсегда? Как ядро ​​определяет, ждать ли поток?

+2

Понюхать домашнее задание .... или экзамен – LPs

+0

Если мьютексы никогда не разблокированы, у вас есть тупик в вашей программе, и насколько ядро, это ваша проблема – StoryTeller

+0

@LPs НЕТ - это вопрос интервью .. Я думаю, что ядро ​​будет нормально планировать ожидающий поток и снова проверяет статус мьютекса, прежде чем вернуть его в исходное состояние. Но не уверен. – FaceBro

ответ

1

Будет ли резьба немедленно возвращена в исходное состояние? Или ядро ​​по-прежнему будет ждать, пока работающий поток будет потреблять свой временной срез и как обычно планировать ожидающий поток?

Как правило, поток теперь готов к запуску. В большинстве систем, если есть доступное ядро, он начнет работать немедленно. Если нет, то это будет рассматриваться в следующий раз, когда планировщик вызывается на любом ядре.

Что делать, если мьютекс не разблокирован навсегда? Как ядро ​​определяет, ждать ли поток?

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

Реализации различаются и могут выполнять все, что соответствует требованиям.

+0

Как ядро ​​волшебным образом задает ожидающий поток как готовый к запуску? Есть ли какой-то ожидающий список потоков мьютекса, который ядро ​​может использовать для отображения статуса? – FaceBro

+2

@FaceBro - Очевидно, OS будет постоянно отслеживать все потоки, так что он просто знает. C и Posix не говорят, как это сделать, но наличие некоторых списков нитей-идентификаторов может быть хорошим способом. –

+0

@FaceBro Я больше всего знаком с реализацией Linux, и именно так оно и работает. –

Смежные вопросы