Может ли неблокирующий системный вызов Win32 (например, ReleaseMutex) привести к блокировке потока и запуску потока с более низким приоритетом? - PullRequest
0 голосов
/ 28 сентября 2019

У меня возникла проблема, когда поток каким-то образом вытесняется потоком с более низким приоритетом, несмотря на тот факт, что поток с более высоким приоритетом не выполняет никаких блокирующих вызовов.Я заметил, что когда поток с более низким приоритетом выгружает поток с более высоким приоритетом, поток с более высоким приоритетом находится в середине системного вызова.В частности, ReleaseMutex и Sleep (0).Возможно ли, что системный вызов делает что-то, что блокирует текущий поток и позволяет запускать поток с более низким приоритетом?

1 Ответ

3 голосов
/ 28 сентября 2019

Приоритет просто означает, что существует определенное количество предпочтений для одного потока перед другим.Всегда может случиться так, что поток по какой-то причине не сможет продвинуться вперед, и поток с более низким приоритетом прекратит его.

Представьте, например, если ReleaseMutex окажется вкакой-то редкий путь к коду из-за странного пограничного случая и кода для обработки этого пограничного случая выгружен на диск.Поток с именем ReleaseMutex не готов к запуску до тех пор, пока не появятся эти кодовые страницы, поэтому поток с более низким приоритетом может получить ЦП.

Не думаю, что это особенно вероятный сценарий.Но дело в том, что этого не произойдет.Приоритет не является исключительным методом или механизмом синхронизации.Это просто способ указать, что вы предпочитаете, когда у системы есть выбор.

Если это вызывает у вас проблемы, у вас есть что-то очень неправильное в вашем дизайне.Если вы пытаетесь использовать приоритеты потоков как способ гарантировать конкретное поведение (а не указывать предпочтения), вы обрабатываете исключение совершенно неправильно.

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