У меня есть несколько потоков (100), которые выполняются в течение нескольких секунд за раз. Когда они выполняются, они проводят значительное количество времени, ожидая ответа от другой системы (последовательное устройство). Я помню, что одновременное выполнение 100 потоков могло быть ресурсом hog, поэтому я фактически ограничиваю количество потоков, которые могут запускаться в любой момент.
Мне кажется, что должны быть хорошие и плохие способы ожидания внешнего события внутри потока. Является ли этот подход интенсивным??:
send command ;
repeat
until response arrived ;
process response ;
и делает ли этот подход более эффективным?:
send command ;
repeat
Sleep (20) ;
until response arrived ;
process response ;
* ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ *
Среда - x86 Windows XP. Код потока представляет собой длинную и вовлеченную последовательность взаимодействий с последовательным устройством, но в целом он состоит из записи символов в COM-порт (с использованием последовательной библиотеки AsyncFree) и ожидание возвращения символов путем размещения в буфере входящих символов и обрабатывая их, когда они прибудут. Я полагаю, что последовательная библиотека делает чтение и запись устройств. Время в потоке может составлять целую минуту или как можно короче, чем через пару секунд, но большая часть времени тратится на то, чтобы символы покинули порт или ожидали ответные символы (скорость в бодах медленная), поэтому мой вопрос о лучшем способе поведения потока во время ожидания. В настоящее время я вызываю Sleep
в цикле, ожидая, когда CharactersInBuffer
станет ненулевым, обработает каждый символ, когда он поступит, и выйдет из потока, когда у меня будет полный ответ. Таким образом, код больше похож (игнорируя обработку тайм-аутов и т.д.):
send command ;
Packet = '' ;
repeat
repeat
Sleep (20) ;
until response character arrived ;
build Packet
until complete packet arrived
process response ;