我正在尝试构建系统的接收端,它通过千兆以太网链路发送UDP段。到目前为止我已经尝试过Matlab和Python,但两种解决方案似乎都没有效率。我总是遇到巨大的丢弃率,这不能用UDP不可靠的事实来解释。我想我没有足够快地读取传入缓冲区,因此新帧被丢弃。
我的问题是,C / C ++实现会比Matlab和Python更快吗?
线程怎么样?这会改善这种情况吗?我在想一个生产者/消费者计划。一个用于处理UDP套接字的线程,另一个用于处理传入的段。不过我仍然对此有所怀疑。例如,如果我使用互斥锁,这意味着当消费者从那里读取时,生产者不能写入队列。这意味着生产者仍然会被消费者的操作所困扰。我错了吗?
答案 0 :(得分:1)
如果使用线程,则需要一个队列来放入消息。这绝对应该受到互斥锁的保护。但是消费者线程在处理消息的整个过程中不需要锁定队列,就在从队列中删除消息时。但是,您应该小心检查队列是否变大,您可能需要多个消费者线程。
答案 1 :(得分:1)
如@JoachimPileborg所述,队列是可行的方法。你可能有几个工作线程从队列中拉出来。此队列有几个可用选项:
这些是标准的生产者/消费者解决方案。
更重要的是确定 为什么 解决方案很慢。 Python应该足够快,c ++也是(个人认为它可能会更快,但可以说是有争议),但我对matlab一无所知。
你应该做的是使用一个好的分析器(python和c ++都有很多选项)。这是一个相关的answer。从这个答案重复:找到瓶颈,并专注于那些。
另外,有什么要求?请记住:“尽快” 不 是有效要求。如果符合吞吐量要求,则可以接受一些数据包丢弃。我在电信系统上工作,我们通过提高吞吐量来测试吞吐量要求,直到它开始丢弃数据包,并测量我们的位置。点是,如果你在限制范围内,它可以下降:)
答案 2 :(得分:0)
如果您只是将UDP数据包转储到网络上,那么绝大多数都会被丢弃,因为您将它们推送到套接字的速度比网络发送的速度快。
请记住,UDP没有任何流量控制或错误恢复。您的应用程序必须确定合适的传输速率,根据需要调整该速率,检测丢失的数据报,安排重新发送丢失的数据报,并将所有接收的数据报汇编成一个连贯的文件。