OpenRTMFP/Cumulus Primer(22)執行緒邏輯分析之一:RTMFPServer執行緒的啟動和等待
OpenRTMFP/Cumulus Primer(22)RTMFPServer執行緒的啟動和等待
- 作者:柳大·Poechant(鍾超 Michael)
- 部落格:Blog.csdn.net/poechant
- 郵箱:zhongchao.ustc@gmail.com
- 日期:August 5th, 2012
1 Poco::Thread
Cumulus 大量使用了 Poco 的執行緒庫。一個簡單的 Poco 執行緒的使用例項如下:
class PoechantRunnable: public Poco::Runnable {
virtual void run() {
// your codes
}
};
int main() {
PoechantRunnable runnable; // Image that it's a gift
Poco::Thread thread; // And… thread is just like your girl
thread.start(runnable); // Okay, give your sweet babe the gift :)
thread.join();
return 0;
}
2 封裝一個可執行執行緒的類
Cumulus 中實現了一個 StartableProcess 類,該類繼承了 Runnable,就是上面那個 gift 嘍。
class StartableProcess : public Poco::Runnable{
public:
StartableProcess(Startable& startable);
private:
void run();
Startable& _startable;
};
可以看到其中有Startable& _startable
引用成員,它並沒有繼承 Runnable,而是封裝了StartableProcess
和Poco::Thread
:
Poco::Thread _thread;
StartableProcess _process;
這裡Startable
封裝了一個StartableProcess
成員,與StartableProcess
是有所區別的。接下倆我們看他們是怎麼用的。
3 啟動RTMFPServer執行緒
我們可以看到在 Startable 類的建構函式中初始化了_process
成員,初始化執行緒成員並傳入執行緒名,設定標誌域(Flag Field)_stop
為true
,因為它還沒有呼叫啟動函式。
Startable::Startable(const string& name)
: _name(name),
_thread(name),
_stop(true),
_haveToJoin(false),
_process(*this) {
}
初始化_process
時,呼叫StartableProcess
建構函式:
StartableProcess::StartableProcess(Startable& startable)
: _startable(startable){
}
傳入_startable
的引用。在 Cumulus 中所有的執行緒的可執行類都是繼承自 Startable 類的,然後通過呼叫 start() 來啟動,啟動後會響應到 run()。下面我們以 RTMFPServer 執行緒為例。
RTMFPServer 類是繼承自 Startable 類的:
class RTMFPServer
: private Gateway,
protected Handler,
private Startable,
private SocketHandler
RTMFPServer 的建構函式:
RTMFPServer::RTMFPServer(UInt32 cores)
: Startable("RTMFPServer"),
_sendingEngine(cores),
_receivingEngine(cores),
_pCirrus(NULL),
_handshake(_receivingEngine,
_sendingEngine,
*this,
_edgesSocket,*this,*this),
_sessions(*this) {
}
其中在初始化時呼叫了其父類的建構函式。接下來就要啟動RTMFPServer執行緒了。
所線上程 | 呼叫者 | 函式 |
---|---|---|
主執行緒 | main(…) | |
主執行緒 | RTMFPServer物件 | RTMFPServer::start() |
主執行緒 | RTMFPServer物件 | Startable::start() |
主執行緒 | RTMFPServer從Startable繼承來的Thread成員 | Thread::start(…) |
RTMFPServer | RTMFPServer物件從Startable繼承來的StartableProcess成員 | StartableProcess::run() |
RTMFPServer | RTMFPServer物件 | RTMFPServer::prerun() |
RTMFPServer | RTMFPServer物件 | Startable::prerun() |
RTMFPServer | RTMFPServer物件 | RTMFPServer::run() |
4 RTMFPServer執行緒等待
在RTMFPServer::run()
實現執行緒的持續執行,主要是依靠這兩行程式碼:
while (!terminate)
handle(terminate);
handle(…)
函式很簡單,如下只進行了sleep(...)
和giveHandle()
兩個操作。
void RTMFPServer::handle(bool& terminate){
if (sleep() != STOP) {
giveHandle();
} else
terminate = true;
}
sleep(…)
是 RTMFPServer 是從 Startable 繼承而來的,宣告如下:
WakeUpType sleep(Poco::UInt32 timeout=0);
定義如下:
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;
}
在執行狀態下,_stop
為false
,而預設引數timeout
為0
,所以會呼叫:
_wakeUpEvent.wait();
這個_wakeUpEvent
成員是一個Poco::Event
物件,Poco::Event
有一個使用方式就是在呼叫Poco::Event::wait()
後,會一直等待Poco::Event::set()
被呼叫後,才會跳出 wait 的狀態。在 Cumulus 中 set 的動作是由:
RTMFPServer::requestHandle()
PoolThread::push(Poco::AutoPtr<RunnableType>& pRunnable)
執行的。
-
轉載請註明柳大·Poechant(鍾超)的CSDN部落格:Blog.CSDN.net/Poechant
-
相關文章
- OpenRTMFP/Cumulus Primer(23)執行緒邏輯分析之二:RTMFPManager對RTMFPServer的影響執行緒Server
- OpenRTMFP/Cumulus Primer(19)獨立使用CumulusLib時的執行緒安全Bug執行緒
- OpenRTMFP/Cumulus Primer(4)CumulusServer啟動流程分析Server
- 主執行緒等待所有其他執行緒執行完畢,然後再繼續執行主執行緒的邏輯,有以下幾種方法可以實現:執行緒
- OpenRTMFP/Cumulus Primer(5)CumulusServer啟動流程分析(續)Server
- 執行緒池 execute() 的工作邏輯執行緒
- 執行緒的啟動執行緒
- 深入分析3種執行緒池執行任務的邏輯方法執行緒
- OpenRTMFP/Cumulus Primer(6)CumulusServer啟動流程分析(續2)Server
- OpenRTMFP/Cumulus Primer(7)CumulusServer啟動流程分析(續3)Server
- OpenRTMFP/Cumulus Primer(5)CumulusServer啟動流程分析(續1)Server
- OpenRTMFP/Cumulus Primer(7)CumulusServer 啟動流程分析(續3)Server
- 執行緒和執行緒池執行緒
- 模擬主執行緒等待子執行緒的過程執行緒
- Java執行緒篇——執行緒的開啟Java執行緒
- 執行緒、開啟執行緒的兩種方式、執行緒下的Join方法、守護執行緒執行緒
- 執行緒啟動原理執行緒
- [02] 多執行緒邏輯程式設計執行緒程式設計
- Java:多執行緒等待所有執行緒結束(CountDownLatch/CyclicBarrier) .Java執行緒CountDownLatch
- Android的執行緒和執行緒池Android執行緒
- 多執行緒-程式和執行緒的概述執行緒
- Java多執行緒的建立和啟動Java執行緒
- C#多執行緒程式設計(1):執行緒的啟動C#執行緒程式設計
- 配置監聽器,建立執行緒定時執行業務邏輯執行緒行業
- 多執行緒和多執行緒同步執行緒
- Java多執行緒/併發07、Thread.Join()讓呼叫執行緒等待子執行緒Java執行緒thread
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- Java 多執行緒基礎(六)執行緒等待與喚醒Java執行緒
- Win32執行緒——等待另一個執行緒結束Win32執行緒
- java執行緒之守護執行緒和使用者執行緒Java執行緒
- 多執行緒-執行緒組的概述和使用執行緒
- 多執行緒-執行緒池的概述和使用執行緒
- 多執行緒-執行緒控制之休眠執行緒執行緒
- 多執行緒-執行緒控制之加入執行緒執行緒
- 多執行緒-執行緒控制之禮讓執行緒執行緒
- 多執行緒-執行緒控制之中斷執行緒執行緒
- [Java併發]執行緒的並行等待Java執行緒並行
- 執行緒同步的情景之一執行緒