Предположим, что в нашем приложении 2 потока:
- Поток A ожидает мьютекс
- Поток B выполняет некоторую работу и удерживает мьютекс
Если поток B разблокирует мьютекс, запускает ли поток A немедленный запуск или ожидает остальную часть временного интервала (который может составлять 15 мс при Windows)?
У меня сложилось впечатление, что Когда мьютекс разблокирован потоком B, поток A все еще должен ждать несколько миллисекунд (максимум до 15 мс), прежде чем он начнет работать, что приводит к заметному замедлению в моем приложении. Я думаю, что (если в системе доступно достаточное количество ядер), может быть быстрее использовать спин-блокировку для переменной atomi c (сравнение и замена или что-то подобное), потому что тогда ожидающий поток может немедленно запуститься. Является ли это хорошей идеей?
Или было бы лучше, если бы поток B явно отказывался от оставшейся части своего времени, вызывая SwitchToThread?
Были бы другие механизмы блокировки (например, CriticalSection, который также имеет вращающуюся функциональность, условную переменную, SRWLock, std :: future, ...) лучше относительно производительности и времени ожидания?
Примечание: этот вопрос не о гарантии получения мьютекса или другого потоки, крадущие мьютекс, это о том, как ожидающая часть мьютекса реализована в Windows (что-то похожее на вопрос Как поток ожидает мьютекс, чтобы вернуться к работе? , но конкретно для Windows ).
Спасибо.