Тайм-аут данных C ++ с блокирующим вызовом - PullRequest
0 голосов
/ 14 декабря 2009

У меня есть основной цикл, который полностью управляется данными: он имеет блокирующий вызов для получения данных и сохраняет его как «самый последний» (доступ к которому есть в другом месте). Каждый фрагмент данных имеет связанный срок службы, по истечении которого данные перестают считаться действительными. Каждый раз, когда я получаю данные, я сбрасываю время ожидания.

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

Может кто-нибудь предложить решение?

Если это поможет, у меня установлен Boost v1.33.1 - но я не могу обновить его до более поздней версии.

1 Ответ

3 голосов
/ 14 декабря 2009

Поскольку истечение срока действия данных является асинхронным событием, вам необходимо использовать асинхронный таймер. Поскольку вы используете boost, вы можете заглянуть в Boost.Asio, который предоставляет вам deadline_timer объекты, которые можно использовать вместе с обработчиками обратного вызова. (См. здесь для получения дополнительной информации.) Обработчик обратного вызова будет вызван по истечении таймера, что позволит вам проверить достоверность ваших данных.

Редактировать: Ааа ... Я только что заметил, что вы застряли с Boost 1.33.1, в котором нет Asio. Что ж, если вам разрешено использовать другие библиотеки, вы можете использовать не-версию Boost Asio, иначе вам придется полагаться на специфичные для ОС методы для реализации асинхронных таймеров. Вы не указываете свою ОС, но в POSIX-совместимых системах вы можете использовать select / poll для тайм-аутов.

На самом деле вы также можете использовать фоновый поток, который спит до истечения срока действия следующего фрагмента данных, затем просыпается и проверяет состояние всех данных и возвращается в спящий режим до истечения срока действия следующего фрагмента данных. Вам просто нужно быть осторожным, чтобы правильно синхронизировать все, чтобы избежать условий гонки.

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