我必须从多播 (UDP) 流中读取一些数据(以惊人的速度 - 每秒最多 5000 条消息)。因为流是多播的(并且数据非常关键),数据提供者提供了两个发送相同数据的流(它们的逻辑是相同数据包在两个流中丢失的可能性非常接近于零)。所有数据包都标有序列号以进行跟踪。
此外,该应用程序对时间非常关键,以至于我不得不并行收听两个流并从它首先收到的任何多播流中获取下一个序列号 - 当相同的数据包出现在镜像流上时,我只是将其丢弃.
我计划在两个函数之间使用一个通用的“sequence_number”变量来实现这个drop特性——顺便说一下,这两个函数在不同的线程中运行。序列号是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
该序列号之前),我基本上会在我的系统中两次收到相同的数据包。有什么办法可以克服这种情况?