Какой дизайн ruby ​​Monitor использует для сигнала / ожидания? - PullRequest
1 голос
/ 14 марта 2012

Кто-нибудь лучше читает исходный код ruby ​​или знает ответ на этот вопрос? (Обратите внимание, насколько я знаю, он имеет ничего общего с GIL).

Ruby предоставляет Monitor с переменными состояния.

В статье Википедии о мониторах (на которую ссылается даже документ ruby ​​doc) говорится, что существует пара различных моделей / конструкций для того, как должны работать мониторы, в отношении того, какой поток получает доступ к блокировке взаимного исключения после сигнал / пробуждение.

Эта статья на Java объясняет это довольно ясно (или, может быть, это будет понятно, если вы какое-то время били себя по этому поводу):

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

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

(И еще пара менее распространенных, которые действительно являются вариациями этих двух).

Кто-нибудь знает, какой рубин использует? Кажется, это не задокументировано. Зависит ли это от реализации в Ruby (МРТ против Юри против Рубиниуса и т. Д.)?

Это имеет значение для определенных проектов. Я думаю, что бился головой о стену, потому что я предполагал, что ruby ​​использовал «SW», потому что это казалось «очевидным» для меня, прежде чем я понял, что различные реализации «Monitor» делали это по-разному. Теперь, основываясь на том, что я наблюдал, я думаю, что рубин на самом деле использует "SC", как указано выше.

Это означает, что после отправки сигнала, когда поток будет пробужден - но нет никакой гарантии, что поток получит блокировку взаимного исключения next , может получиться другой случайный поток, ожидающий его. это первое.

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

...