Обязательно ли вызов для разблокировки мьютекса переключается на другой поток, который был заблокирован при блокировке? - PullRequest
1 голос
/ 04 апреля 2020

Допустим, у нас есть два потока: th1 и th2.

Давайте представим следующую строку событий:

  1. Th1 блокирует мьютекс и выполняет некоторую работу в его критическом состоянии. region.

  2. Th2 вызывает блокировку мьютекса, но блокируется.

  3. Th1 завершает свою работу в критической области и разблокирует мьютекс.

Мой вопрос теперь таков: даже если бы th1 еще оставалось некоторое время на работу, вызов к разблокировке мьютекса обязательно вызовет немедленное переключение контекста на поток, который заблокирован на блокировке ( в этом случае до th2) если есть?

1 Ответ

3 голосов
/ 06 апреля 2020

Нет, или в самой определенной реализации.

Как правило, неоспоримым мьютексным операциям вообще не нужно входить в ядро, они просто атомарные c операции в области памяти. Когда обнаружен конфликт, например, один поток хочет заблокировать мьютекс, которым владеет другой поток, желающий поток должен ввести ядро ​​для его ожидания; и ядру необходимо настроить мьютекс так, чтобы поток-владелец сигнализировал ядру, когда это сделано с ним.

Различие состоит в том, что enter может блокироваться бесконечно до освобождение мьютекса; в то время как сигнал просто указывает, что такое событие произошло.

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

Может ли ожидающий поток работать до того, как освобождающий поток может быть основан на определенных c вещах, таких как приоритет или планирование учебный класс. С точки зрения мультипроцессоров, оба потока могут быть одновременно развернуты на отдельных процессорах, поэтому следующее приобретение мьютекса может быть совершенно недетерминированным c.

С другой стороны, некоторые системы, такие как честное планирование от Google мьютексы (полностью выполняемые в пользовательском режиме) гарантируют, что голодание, подразумеваемое в предыдущем абзаце, не может произойти.

Итак, реализация определена; и определение, предоставленное вашей реализацией, многое говорит о вашей реализации.

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