1

我正在尝试构建系统的接收端,它通过千兆以太网链路发送 UDP 段。到目前为止,我已经尝试过 Matlab 和 Python,但两种解决方案似乎都没有效率。我总是遇到巨大的丢包率,这不能用 UDP 不可靠的事实来解释。我想我没有足够快地读取传入的缓冲区,因此新帧被丢弃。

我的问题是,C/C++ 实现会比 Matlab 和 Python 更快吗?

那么线程呢?这会改善情况吗?我正在考虑一个生产者/消费者计划。一个线程用于处理 UDP 套接字,另一个用于处理传入的段。不过,我对此仍有一些疑问。例如,如果我使用互斥锁,这意味着生产者无法写入队列,而消费者从那里读取。这意味着生产者仍然会因消费者的操作而停滞不前。我错了吗?

4

3 回答 3

1

如果您使用线程,则需要一个队列来放入消息。这绝对应该受到互斥锁的保护。但是消费者线程不需要在处理消息的整个过程中锁定队列,只是在从队列中删除消息时。但是,您应该小心检查队列是否变大,您可能需要多个消费者线程。

于 2012-06-01T10:22:58.957 回答
1

正如@JoachimPileborg 所提到的,队列是要走的路。您可以让多个工作线程退出队列。此队列有几个可用选项:

  • 一个简单的队列,具有用于读/写操作的简单互斥保护
  • 无锁队列,通常使用原子操作来保持一致性
  • 一个 2 队列系统,其中一个队列用于写入,另一个队列用于读取。当读取队列为空时,切换队列。

这些是标准的生产者/消费者解决方案。

比这更重要的是确定解决方案缓慢的原因。Python 应该足够快,c++ 也应该足够快(我个人认为它可能会更快,但这可能会引起争议),不过我对 matlab 一无所知。

你应该做的是使用一个好的分析器(python 和 c++ 都有很多选项)。这是一个相关的答案。重复那个答案:找到瓶颈并专注于那些。

另外,有什么要求吗?请记住:“尽可能快”不是有效要求。如果您符合吞吐量要求,则可以接受一些丢包。我在一个电信系统上工作,我们通过提高吞吐量直到它开始丢弃数据包来测试吞吐量要求,并测量我们的位置。关键是,如果您在限制范围内,可以放弃:)

于 2012-06-01T10:42:55.777 回答
0

If you are simply dumping UDP packets onto the network, then the vast majority are going to be dropped because you are pushing them into the socket faster than the network can send them.

Remember that UDP does not have any flow-control or error recovery. Your application must determine a suitable transmit rate, adjust that rate as needed, detect missing datagrams, arrange for missing datagrams to be resent, and assemble all the received datagrams into a coherent file.

That is not easy: See this answer to a similar question.

于 2012-06-04T19:12:39.950 回答