OpenRTMFP/Cumulus Primer(23)執行緒邏輯分析之二:RTMFPManager對RTMFPServer的影響

鍾超發表於2012-08-05

OpenRTMFP/Cumulus Primer(23)執行緒邏輯分析之二:RTMFPManager對RTMFPServer的影響

  • 作者:柳大·Poechant(鍾超 Michael)
  • 部落格:Blog.csdn.net/poechant
  • 郵箱:zhongchao.ustc@gmail.com
  • 日期:August 5th, 2012

RTMFPManagerRTMFPServer同樣,繼承自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();
}

這裡要強調的是,這裡的setPriorityLinux環境下會設定失敗,可以參見我在CumulusGithub上開啟的Issue #75,其中就包括這裡的執行緒優先順序設定。

在這裡我們可以看到RTMFPManagerhandle(…)中的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;
}

你可以自行修改RTMFPServersleep(...)的引數,這樣就會呼叫_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

-

相關文章