В настоящее время я использую select()
в качестве таймера. У меня есть операции приема по сети, которые происходят внутри цикла, и каждые несколько секунд должна выполняться операция обработки.
В результате время ожидания оператора select () постоянно меняется - со временем уменьшается до нуля, а затем перезапускается с 3.
rv = select(selectmonitor+1, &readnet, NULL, NULL, &helper.timeout());
Когда что-то приходит в сеть, оператор повторяется, и значение, передаваемое ему helper.timeout (), уменьшается. В конце концов, значение будет либо равно нулю, либо система отключится, что приведет к выполнению функции обработки. Тем не менее, я заметил, что это достаточно ресурсоемкий - значение helper.timeout () должно постоянно вычисляться. Когда я пытаюсь получить несколько тысяч пакетов в секунду, время, необходимое для выполнения этой операции, приводит к потере пакетов.
Моя новая идея использует SIGALRM
для решения этой проблемы. Это позволило бы мне установить таймер один раз, а затем реагировать, когда он выключен. Однако я не понимаю, как это повлияет на мою программу. Когда SIGALRM «выключается», он запускает функцию, которую я указываю. Однако как это прервет мой существующий код? И как только функция будет завершена, как возобновится мой существующий код (внутри оператора while
)?
Кроме того, представляется невозможным установить сигнал SIGALRM для вызова функции внутри класса? Это правильно? Я полагаю, что могу вызвать функцию, которая, в свою очередь, может вызвать функцию внутри класса.
Спасибо за любую помощь заранее.