Мне нужно прочитать некоторые данные (которые поступают с невероятной скоростью - до 5000 сообщений в секунду) из многоадресного (UDP) потока. Поскольку поток является многоадресным (и данные очень важны), поставщик данных предоставил два потока, которые отправляют идентичные данные (их логика заключается в том, что вероятность отбрасывания одного и того же пакета в обоих потоках очень близка к нулю). Все пакеты данных помечены порядковым номером для отслеживания.
Кроме того, приложение настолько критично по времени, что я вынужден прослушивать оба потока параллельно и выбирать следующий порядковый номер из того, какой многоадресный поток был получен первым - когда тот же пакет поступает в зеркальный поток, я просто отбрасываю его. .
Я планирую реализовать эту функцию перетаскивания, используя общую переменную "sequence_number" между двумя функциями, которые, кстати, выполняются в разных потоках. Порядковый номер atomic
, поскольку он будет считываться и обновляться из двух разных потоков.
На ум приходит очевидный алгоритм:
if (sequence number received from the stream > sequence_number)
{
process packet;
sequence_number = sequence number received from the stream;
}
(Вышеупомянутый алгоритм необходимо изменить для тех случаев, когда порядковые номера выходят из строя - и они могут, поскольку это поток UDP, но давайте пока забудем об этом)
У меня такой вопрос:
С того момента, как я std::load
мой sequence_number
, проверяю, меньше ли он, чем порядковый номер, который я получил из потока, принимаю пакет и наконец std::store
новый порядковый номер на sequence_number
; если другой поток получает тот же пакет (с тем же порядковым номером) и выполняет те же операции (до того, как первый поток завершит std::store
на этом порядковом номере), я, по сути, получу один и тот же пакет дважды в моей системе. Как выйти из этой ситуации?
set
-подобная структура, основанная на порядковом номере, вам не нужно беспокоиться о том, как определять, когда вообще игнорировать пакеты, структура данных сделает это за вас. - person aruisdante   schedule 19.07.2014compare_exchange
, чтобы не заменять пустой слот. - person Ben Voigt   schedule 19.07.2014