После некоторых исследований я узнал ответы на свои вопросы.В целом CodeInChaos и Хенк Холтерман были правы, но вот некоторые детали.
Когда поток начинает бороться за блокировку с другими потоками, он сначала выполняет цикл ожидания ожидания, пытаясь получить блокировку.Все эти действия выполняются в пользовательском режиме .Затем, если не удалось создать объект ядра ОС Event
, поток переключается в режим kernel-mode и ожидает сигнала от этого Event
.
Так что ответьте на мои вопросы:
1. В лучшем случае нет, но в худшем да (Event
объект лениво создает, если требуется);
2. В общем, он работает врежим, но если потоки конкурируют за блокировку слишком долго, поток может быть переключен в режим ядра (через вызов неуправляемой функции Win API);
3. Затраты на переключение из режима пользователя в режим ядра (~ 1000 циклов ЦП);
4. Microsoft заявляет, что это «честный» алгоритм, такой как FIFO, но это не гарантирует этого.(Например, если поток из «очереди ожидания» будет приостановлен, он перемещается в конец очереди, когда он будет возобновлен.)