Получает ли поток в состоянии «готовности» блокировку - PullRequest
0 голосов
/ 09 февраля 2020

Потоки и параллельное программирование действительно запутывают меня. В этой книге на странице 9 указана проблема, заключающаяся в том, что хотя поток может быть запланирован и переведен в состояние ready, это не обязательно означает, что он установил блокировку.

Вкратце, поток (скажем, t1), ожидающий блокировки, уведомляется через condition_variable, и поток переводится в состояние ready, но не выполняется. Но непосредственно перед тем, как он сможет что-либо запустить, запланирован и выполняется другой поток (скажем, t2). Это означает, что условие, при котором t1 предполагает его пробуждение, больше не выполняется.

Означает ли это, что простое планирование потока или перевод его в состояние готовности не означает, что он получил блокировку? Если это так, должен ли я всегда ставить предварительное условие через некоторое время l oop? Это другое возможное значение ложного пробуждения? Кроме того, о каких других подобных случаях я должен знать?

Я всегда исходил из предположения, что если поток проснулся от ожидания (что не является ложным пробуждением), он сразу же получит блокировку (wakeup = блокировка получена, при this обстоятельство), поскольку ядро ​​отслеживает это.

Этот вопрос тесно связан с другим моим вопросом, опубликованным здесь .

Спасибо.

Где я могу задать эти вопросы о новичках, в виде интерактивного формата с дополнительными вопросами? Они кажутся слишком глупыми для стека переполнения.

1 Ответ

0 голосов
/ 09 февраля 2020

я должен всегда ставить условие через некоторое время l oop?

Это хорошая практика. Даже если вы знаете, что на какой-то конкретной аппаратной платформе и ОС, функция wait () не может вернуться, если условие не выполняется; он может вести себя по-другому после обновления ОС, или он может вести себя по-другому, если ваш код перемещен на другую платформу, или он может вести себя по-другому после внесения каких-либо изменений в ваш код.

Если вы когда-либо работали разработка «корпоративного» программного обеспечения, тогда такие изменения могут и произойдут. Можно также начать изучать хорошие привычки, которые могут помочь предотвратить будущие бедствия.

Я всегда исходил из того, что если поток просыпается от ожидания (что не является ложным пробуждением), он немедленно получает блокировку

Можно с уверенностью предположить, что wait() при любых обстоятельствах никогда не вернется, пока мьютекс не будет повторно заблокирован. Вся парадигма wait() / notify() зависит от ее поведения.

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