Когда вы составили список используемых потоков и определили для них порядок приоритетов, который имеет смысл с точки зрения выполняемой ими работы.
Если вы подтолкнете потоки туда-сюда, чтобы избежать выхода из проблемы, в конечном итоге все они будут иметь высокий приоритет, и вы вернетесь к тому, с чего начали. Не думайте, что вы можете исправить состояние гонки с расстановкой приоритетов, когда действительно нужно заблокировать, потому что есть вероятность, что вы исправили это только в дружественных условиях. Тем не менее могут быть случаи, когда он может потерпеть неудачу, например, когда поток с более низким приоритетом подвергся наследованию приоритета, потому что другой поток с высоким приоритетом ожидает другой блокировки, которую он удерживает.
Если вы классифицируете потоки по типу «эти потоки заполняют аудио буфер», «эти потоки делают мое приложение отзывчивым на системные события», «эти потоки делают мое приложение отзывчивым к пользователю», «эти потоки включаются с некоторыми делами и сообщит, когда они будут хорошими и готовыми ", тогда потоки должны быть соответственно расставлены по приоритетам.
Наконец, это зависит от ОС. Если приоритет потока является полностью вторичным по отношению к приоритету процесса, то расстановка приоритетов потоков не должна быть «опасной»: единственное, что вы можете голодать - это вы сами. Но если ваши высокоприоритетные потоки предпочтительнее, чем потоки с обычным приоритетом других, не связанных приложений, то вы несете более широкую ответственность. Вы должны поднимать приоритеты только тем, которые выполняют небольшие объемы срочной работы. Определение «маленького» зависит от того, на каком устройстве вы находитесь - с многоядерным процессором 3 ГГц вам многое не по плечу, но у мобильного устройства могут быть ложные ожидания в реальном времени, которые могут сломать приложения пользовательского уровня.
Поддержание обслуживания аудиобуфера является каноническим примером того, когда следует иметь высокий приоритет, так как небольшие потери в работе обычно вызывают неприятное потрескивание. Длинные загрузки (или другие медленные операции ввода-вывода) являются каноническим примером того, когда нужно иметь низкий приоритет, поскольку нет необходимости в срочном порядке обрабатывать этот кусок данных, если следующий не будет в любом случае. Если вы когда-нибудь пишете драйвер устройства, вам нужно будет принимать более сложные решения, как приятно играть с другими.