У меня есть вопросы, касающиеся альтернативных способов отложить программу на C ++, кроме сна.
У меня есть часть моей программы, которая получает и отправляет UDP-пакеты на контроллер. Эта часть программы должна работать асинхронно. Чтобы уменьшить накладные расходы этого провайдера, я решил использовать асинхронный ввод-вывод для получения пакетов UDP, а не иметь отдельный поток, контролирующий сокет.
Я последовал за этот пример sigaction для достижения этой цели. Я заметил, что если я попытаюсь использовать usleep, когда эта сигмация активна, она нарушит мой сон, когда я получу пакет. Этот вид имеет смысл, так как я предполагаю, что sigaction вызван каким-то прерыванием на процессоре, которое может помешать процессору спать. Если у кого-нибудь есть хорошее объяснение, почему это происходит, мне было бы интересно узнать. Моя проблема заключается в том, что бывают случаи, когда мне приходится отправлять несколько пакетов подряд, и необходимо убедиться, что они задержаны, иначе они будут пропущены моим контроллером.
Я обычно использовал бы режим сна, чтобы задержать отправку пакетов, но теперь я не могу из-за того, что он сломался из-за моей подписи. Я думал о том, чтобы использовать занятое ожидание, но это может быть слишком непоследовательным. У меня также есть возможность использования очереди пакетов, которая очищается через регулярные промежутки времени с использованием таймера, но кажется, что может быть более простое решение.
Есть ли другой способ отложить отправку пакетов, кроме сна? Есть ли способ настроить мой асинхронный ввод-вывод, чтобы он не нарушал сон? Я поступаю об этом неправильно?
Обычно при написании асинхронной программы вы переключаетесь на стиль программирования цикла событий. Любая система событий даст вам возможность настроить таймеры, которые запускают обратные вызовы, используя те, которые вы можете настроить для отправки трафика и тому подобное. Кроме того, вы обычно используете их для просмотра ваших сокетов и просто вызываете ваши обратные вызовы, когда есть что почитать. Хотя это и не важно для UDP, если вы имеете дело с TCP в любой момент, вы также хотите использовать их для вызова обратных вызовов, когда сокеты готовы к записи, таким образом, вы никогда не блокируете свой процесс, пытаясь записать данные ,
Мне лично нравится http://libevent.org/ хотя я слышал и хорошие вещи о либераве.
Это должно прояснить некоторые вещи:
из руководства по сну:
Return Value
Zero if the requested time has elapsed, or the number of seconds left to sleep, if the call was interrupted by a signal handler.
Один из вариантов — создать цикл, который проверяет, истекло ли уже время (так как в режиме сна возвращается количество секунд, оставшихся после прерывания) или нет. если не просто выполнить еще один сон и так далее, до конца необходимого времени.