哪一种架构更适合c#多线程系统中的媒体缓冲区管理?

本文关键字:系统 媒体 缓冲区管理 多线程 哪一种 | 更新日期: 2023-09-27 17:51:06

我有一个c#系统,其中服务器应用程序逐帧接收视频,它的责任是将此帧发送到所有连接的客户端。我有一个线程做下载帧和存储的工作。其他客户端连接线程将读取这些存储帧并将其发送给客户端。现在我的疑问是,对于多线程环境,哪种是存储帧的最佳方式。

我计划了两种方法。一种方法是使用Queue类,并通过锁封装来使用enque-deque,另一种方法是将帧转储到文件中,所有读写线程以共享模式打开该文件。哪个更注重性能?有没有其他更好的方法来做这件事?

我对以上两种方法的一些假设如下。1)锁定队列会降低性能2)文件IO不需要锁定,因为文件是在共享模式下打开的,并且有单独的文件指针。3)对于队列方法,需要定义队列长度来管理RAM中的内存限制。而这些内存限制的约束需要更多的技术来管理其他情况,如队列溢出。3)要从队列发送相同的帧到多个客户端,我需要寻找队列的更改。4)文件IO会比队列管理慢。

注:内存映射文件IO可以帮助我实现更多的性能在我的场景?

请提供任何赞成/反对/意见。谢谢。

哪一种架构更适合c#多线程系统中的媒体缓冲区管理?

我认为两者都应该工作-我真的怀疑锁和/或从文件系统读/写的开销是否与流式输入/输出数据的速率相当。

说,从理论的角度来看,选择实际上取决于你输出数据的速度和输入数据的速度。如果两者几乎相同,那么你可以使用内存结构,因为你的队列不太可能一直快速填满(因为队列和退出队列的发生速度几乎相同)。

最后,您总是可以选择一种混合方法,它将为您提供两个世界的优势。您可以使用内存队列,但队列元素不必是实际的视频帧-它可以是一个数据结构,它将告诉您数据在哪里(内存中或文件中)。这样,您的排队/去排队逻辑就独立于数据存储。实际的存储代码可以根据内存可用性来决定存储的位置——例如,您可以在内存中最多存储50帧,稍后的帧将存储到文件中(一个或多个)。当内存帧被传输时,该插槽将变为空,下一帧下载可以进入该插槽。