Подтвердить что ты не робот

Внутренняя реализация Lock (Monitor) в .NET.

Для освоения некоторых технологий вы должны знать, как это сделать на одном уровне абстракции ниже. В случае многопоточного программирования полезно знать о примитивах синхронизации.
Вот вопрос, как реализован Lock (Monitor) в .NET?

Меня интересуют такие моменты:
- использует ли он объекты ОС?;
- требуется ли режим пользователя или режим ядра?;
- что накладные расходы для потоков, которые ждут блокировки?;
- в каких случаях может быть нарушена очередь на очереди, ожидающая блокировки?

Обновлено:
"Если более чем один поток поддерживает блокировку, они ставятся в очередь на" готовую очередь "и предоставляют блокировку на основе" первым пришел, первым обслужен ". Примечание: Нюансы в поведении Windows и CLR означают, что справедливость иногда может быть нарушена очередь." [С# 4.0 в двух словах, Джозеф Альбахари] Так вот об этом я и спрашиваю в последнем вопросе о "нарушенной очереди".

4b9b3361

Ответ 1

После некоторых исследований я выяснил ответы на свои вопросы. В целом CodeInChaos и Хенк Холтерман были правы, но вот некоторые подробности.

Когда поток начинает бороться за блокировку с другими потоками, сначала он затягивает цикл ожидания, пытаясь получить блокировку. Все эти действия выполняются в пользовательском режиме. Тогда, если не удастся создать объект ядра OS Event, поток переключается в режим ядра и ждет сигнала от этого Event.

Поэтому ответ на мои вопросы:
1. В лучшем случае нет, но в худшем случае да (Event объект лениво создает, если требуется);
2. В целом он работает в пользовательском режиме, но если потоки слишком долго конкурируют за блокировку, поток можно переключить в режим ядра (через вызов неуправляемой функции Win API),
3. Накладные расходы для переключения из режима пользователя в режим ядра (~ 1000 циклов процессора);
4. Microsoft заявляет, что это "честный" алгоритм, такой как FIFO, но это не гарантирует этого. (Например, если поток из очереди ожидания будет приостановлен, он перемещается в конец очереди, когда он будет возобновлен.)

Ответ 2

Статья в Википедии содержит довольно хорошее описание того, что такое "Монитор", а также его базовая технология - Переменная состояния.

Обратите внимание, что .NET Monitor - это правильная реализация переменной условия; большинство опубликованных версий резюме Win32 неверны, даже те, которые содержатся в обычно уважаемых источниках, таких как доктор Доббс. Это связано с тем, что CV не может быть легко построено из существующих примитивов синхронизации Win32.

Вместо того, чтобы просто строить неглубокую (и некорректную) оболочку поверх примитивов Win32, реализация .NET CV использует тот факт, что она на платформе .NET, реализуя собственные очереди ожидания и т.д.