您的位置:首页 > 产品设计 > 产品经理

OpenRTMFP/Cumulus Primer(23)线程逻辑分析之二:RTMFPManager对RTMFPServer的影响

2012-08-05 01:58 821 查看

OpenRTMFP/Cumulus Primer(23)线程逻辑分析之二:RTMFPManager对RTMFPServer的影响

作者:柳大·Poechant(钟超 Michael)
博客:Blog.csdn.net/poechant
邮箱:zhongchao.ustc@gmail.com
日期:August 5th, 2012
RTMFPManager
RTMFPServer
同样,继承自
Startable
class RTMFPManager : private Task, private Startable
在构造函数中将
RTMFPServer
对象以引用方式传入,用以初始化其
_server
引用成员。
RTMFPManager(RTMFPServer& server)
    : _server(server),
      Task(server),
      Startable("RTMFPManager")  {
    start();
}
. . .
RTMFPServer& _server;
RTMFPManager
的构造函数中调用
start()
成员函数,是从
Startable
继承而来的。然后会开启一个新的名为
RTMFPManager
的线程。然后响应到
RTMFPManager::run()
函数。
void run() {
    setPriority(Thread::PRIO_LOW);
    while(sleep(2000)!=STOP)
        waitHandle();
}
这里要强调的是,这里的
setPriority
Linux
环境下会设置失败,可以参见我在
Cumulus
Github
上开启的
Issue #75
,其中就包括这里的线程优先级设置。在这里我们可以看到
RTMFPManager
handle(…)
中的
sleep(…)
是每 2 秒一次,而这是对
RTMFPServer
线程有影响的。还记得我说的
RTMFPServer
线程的
_wakeUpEvent
成员吗?(在《OpenRTMFP/Cumulus Primer(22)RTMFPServer线程的启动和等待》一文中)它的激活就是在
RTMFPManager
中进行的,所以这里这个 2 秒是会影响到
RTMFPServer
的主循环的等待时间的。
Startable::WakeUpType Startable::sleep(UInt32 timeout) {
    if(_stop)
        return STOP;
     WakeUpType result = WAKEUP;
     if(timeout>0) {
         if(!_wakeUpEvent.tryWait(timeout))
             result = TIMEOUT;
     } else {
         _wakeUpEvent.wait();
     }
    if(_stop)
        return STOP;
    return result;
}
你可以自行修改
RTMFPServer
sleep(...)
的参数,这样就会调用
_wakeUpEvent.tryWait(timeout)
了,按照指定的等待时间(即
timeout
)来进行睡眠。
RTMFPManager
的作用是什么呢?核心就在于它的
handle
成员函数:
void handle() {
    _server.manage();
}
这里就会调用到
RTMFPServer::manage()
,所以你要在阅读
RTMFPServer
源码时知道
RTMFPServer::manage()
函数并不是在
RTMFPServer
线程内运行的,而是
RTMFPManager
线程内运行的。它的定义如下:
void RTMFPServer::manage() {
    _handshake.manage();
    _sessions.manage();
}
它实现对现有 Session 的一些管理,比如终止已经死掉的 Session。-转载请注明来自柳大·Poechant(钟超)的CSDN博客:Blog.CSDN.net/Poechant-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: