Приостановка и возобновление потоков в C ++ - PullRequest
1 голос
/ 19 апреля 2011


Мое приложение должно приостанавливать и возобновлять другой процесс каждые несколько * микросек * с.
Работает нормально, только иногда кажется, что оно приостанавливает процесс на время, отличное от униформы.
Я используюAPI Win: ResumeThread и SuspendThread.

С другой стороны, я попробовал что-то немного другое.
Я приостановил поток как обычно с SuspendThread, но когда я возобновляю его, я делаю так:

while (ResumeThread(threadHandle) > 0);

и он работает быстрее, и запускает другой процесс в одинаковом темпе.
Почему это происходит?Возможно ли, что иногда поток приостанавливается дважды, а затем выполняется команда ResumeThread?
спасибо :)

Ответы [ 3 ]

3 голосов
/ 19 апреля 2011

SuspendThread() вызов не приостанавливает поток мгновенно.Сохранение контекста выполнения занимает несколько раз, так что ResumeThread() может быть вызвано, когда поток еще не приостановлен.Вот почему while (ResumeThread(threadHandle) > 0); работает.Чтобы определить текущее состояние потока, вы можете вызвать NtQueryInformationThread () , но только в версиях Windows NT.

Если у вас есть цикл во вторичном потоке, вы можете изменить синхронизациюСобытие ручного сброса.Основной поток должен вызвать ResetEvent() для приостановки потока и SetEvent() для возобновления.Вторичный поток каждый цикл должен вызывать WaitForSingleObjectEx().

0 голосов
/ 14 февраля 2017

вот так выглядит де-петля

for(i=0;i<num;i++) {     
  while (ResumeThread(threadHandle) > 0);
  ResumeThread(threadHandle)
  SuspendThread(threadHandle);      
}

SuspendThread занимает несколько миллисекунд, поэтому цикл while продолжается до приостановки потока, после чего снова вызывается функция потока SuspendThread, хороший способ вызвать GetProcessContext, чтобы увидеть EIP

0 голосов
/ 04 сентября 2014

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

Единственный раз, когда я должен использовать приостановку, это когда я впервые создаю поток и после распределения работы ему поток возобновляется из потока моего сервера.Созданный поток снова и снова используется в пуле потоков для выполнения некоторой работы.

Он работает как шарм.

Спасибо, Дэймон!

С уважением,

Ajay

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