Если поток ожидает мьютекс и мьютекс освобождается другим потоком, немедленно ли запускается ожидающий поток или ожидает до конца временного интервала? - PullRequest
0 голосов
/ 16 марта 2020

Предположим, что в нашем приложении 2 потока:

  • Поток A ожидает мьютекс
  • Поток B выполняет некоторую работу и удерживает мьютекс

Если поток B разблокирует мьютекс, запускает ли поток A немедленный запуск или ожидает остальную часть временного интервала (который может составлять 15 мс при Windows)?

У меня сложилось впечатление, что Когда мьютекс разблокирован потоком B, поток A все еще должен ждать несколько миллисекунд (максимум до 15 мс), прежде чем он начнет работать, что приводит к заметному замедлению в моем приложении. Я думаю, что (если в системе доступно достаточное количество ядер), может быть быстрее использовать спин-блокировку для переменной atomi c (сравнение и замена или что-то подобное), потому что тогда ожидающий поток может немедленно запуститься. Является ли это хорошей идеей?

Или было бы лучше, если бы поток B явно отказывался от оставшейся части своего времени, вызывая SwitchToThread?

Были бы другие механизмы блокировки (например, CriticalSection, который также имеет вращающуюся функциональность, условную переменную, SRWLock, std :: future, ...) лучше относительно производительности и времени ожидания?

Примечание: этот вопрос не о гарантии получения мьютекса или другого потоки, крадущие мьютекс, это о том, как ожидающая часть мьютекса реализована в Windows (что-то похожее на вопрос Как поток ожидает мьютекс, чтобы вернуться к работе? , но конкретно для Windows ).

Спасибо.

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