Как я могу сказать Windows XP / 7 не переключать потоки во время определенного сегмента моего кода? - PullRequest
3 голосов
/ 28 января 2012

Я хочу предотвратить переключение потоков в Windows XP / 7 в критической по времени части моего кода, которая выполняется в фоновом потоке. Я почти уверен, что не смогу создать ситуацию, в которой я могу гарантировать, что этого не произойдет из-за прерываний с более высоким приоритетом из системных драйверов и т. Д. Однако я хотел бы уменьшить вероятность переключения потоков во время этой части моего кода до минимума, что я могу. Существуют ли какие-либо флаги создания потока или вызовы API Window, которые могут мне помочь? Общие советы по технике тоже приветствуются. Если есть способ сделать это без повышения приоритета потоков до критических в реальном времени, это было бы замечательно, так как я беспокоюсь о создании проблем с производительностью системы для пользователя, если я это сделаю.

ОБНОВЛЕНИЕ: я добавляю это обновление после просмотра первых ответов на мой оригинальный пост. Конкретное приложение, мотивировавшее этот вопрос, связано с потоковой передачей звука в реальном времени. Я хочу устранить каждую задержку, которую я могу. После кодирования моего первоначального проекта я обнаружил, что переключение потоков может вызывать задержку в 70 мс или более. Поскольку мое приложение находится между двумя сокетами, выступающими в качестве посредника для передачи звука, как только я получаю звуковой буфер, я хочу немедленно развернуться и вытолкнуть его в целевой разъем. В моем первоначальном проекте использовались два взаимодействующих потока и семафор, поскольку один поток управлял исходным сокетом, а другой - целевым. Эта архитектура возникла из того факта, что два устройства за сокетами являются разнородными объектами.

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

Обратите внимание, я знаю, что код O / S за сокетами вводит (потенциальные) собственные задержки.

1 Ответ

4 голосов
/ 28 января 2012

AFAIK нет таких флагов в CreateThread и т. Д. (Это также не имеет смысла, ИМХО). Вы можете отложить другие потоки в вашем процессе от выполнения во время в критических ситуациях (перечисляя их и используя SuspendThread), так же как вы теоретически можете перечислять и приостанавливать потоки в других процессах.

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

ИМХО - вы должны использовать то, что предложено для этого случая - играть с приоритетами потоков / процессов (также вы можете рассмотреть SetThreadPriorityBoost). Кроме того, ОС имеет тенденцию повышать приоритет для потоков, которые обычно не используют процессор агрессивно. То есть потоки, которые работают часто, но на короткий промежуток времени (до вызова одной из ожидающих функций, которая приостанавливает их до некоторого условия), считаются «хорошими» и имеют приоритеты.

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