基于live555实现流媒体代理服务器(5)-多线程

基于live555实现多线程代理服务器或点播服务器,其实是一个比较复杂的流程,为了方便后续的讲述,这里首先给出架构设计,或者说是思路吧!

1、首先需要找到创建多线程的点,或说时机;一般来说,至少有两种思路:一种是,单线程处理所有的rtsp消息或信令;使用多线程处理rtp/rtcp媒体流,类似信令和媒体分开处理,这种方法对于rtp over udp应该没有问题,但是rtp over rtsp的话,就有些复杂了,或者是否能够实现,我还不太确定;另一种就相对简单了,使用线程池的思路,在live555初始化时候,创建线程池,每一个线程完全独立运行,处理整个rtsp会话,只需要将公用资源加锁就可以了,为了节省端口资源可以将accept函数放在独立线程处理;基本上就是,accept函数在独立的主线程中,负责接收tcp连接;然后将接收的连接分配给负载的子线程处理rtsp会话,每个rtsp会话都在独立的一个负载子线程中处理;也就是一个主线程处理tcp连接,一个多线程的线程池,负载均衡的处理rtsp会话;我们实现的就是第二种相对简单的方法。

2、基于live555单线程事件调度的原理,以及上面的描述,所以我们需要确保每一个rtsp会话在同一个线程中进行处理;如何理解这句话,按照1中描述的思路,实际在tcp链接完成后,分配的单个线程来处理所有的rtsp消息,实际上已经初步确保了整个会话在独立的同一个线程中处理了;那这里单独拎出来讲是什么意思呢?因为,在rtsp会话过程中,一旦发生了tcp重连,就会导致重连的tcp连接进入accept主线程,会被重新分配线程处理,此时可能分配给了不同的线程,我们就需要进行线程切换了,需要确保出现tcp重连后,我们还能将该会话调度到原始的线程继续进行处理;什么时候会出现tcp重连,rtsp会话建立过程中,以及会话建立后,都可能会出现,所以这个线程切换需要在任何可能的时候执行,这也是多线程实现的主要难点;

3、完成了上述两步的处理实际就可以了,剩下只需要确保在一些公共资源的处理时,不要出现不同步的问题就可以了,也就是适当的对公共资源加锁即可;

废话讲的有些多,直接上代码了:

//多线程创建的时机,在服务器构造函数中创建线程池

GenericMediaServer::GenericMediaServer(UsageEnvironment &env, int ourSocket, Port ourPort,
                                       unsigned reclamationSeconds, unsigned subThreadNum)
  : Medium(env), fSubThreadNum(subThreadNum), fSubThreadList(NULL), fCapsControlTask(NULL),

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值