Live555學習筆記14-live555多線程論

十四:live555多線程論


江湖傳聞:live555如果不改爲多線程,在多核心機器上效率會降低.
雖然我沒做過測試,但比較相信此傳聞的真實性 .


所以在我試論述一下live555如何對多核進行支持,其實就是改爲多線程,嘿嘿.


先看此文:http://www.live555.com/liveMedia/faq.html#threads


跟據它的說法,live555改多線程似乎不難,因爲所有全局性的東西幾乎都保存在UsageEnvironment的liveMediaPriv和groupsockPriv中,groupsockPriv裏面放所有的GroupSock,而liveMediaPriv指向了一個HashTab類:_Tables,_Tables中有兩個變量:mediaTable和socketTable.分別指向兩個Hash Tab,mediaTable中存放所有從Meduim派生出來的類對象,socketTable存放的是StreamSocket們(我猜的,嘿嘿),比如SocketDescriptor.總之,全局性的東西們都放在UsageEnvironment內.


所以,如果開了多線程,爲每個線程創建一個UsageEnvironment,然後調用各自UsageEnvironment的TaskSchedule的EventLoop(),理論上應該能實現各線程各自爲戰,互不干擾.
但是RTSPServer卻只能有一個,所以,各線程之間還必須有少量的交集.而且,RTSPServer最好單獨放在一個線程中吧?因它總攬全局,所以正好放在主線程中.當然主線程也要有自己的UsageEnvironment和event loop.


如果真的實現了多線程,我們完全可以跟據CPU的數量確定線程的個數.那在什麼時機,如何創建新線程呢?
想一下各RtspClientSession 的創建過程:RTSPServer收到新客戶端請求後,先創建與客戶對應的RTSPClientSession,RTSPClientSession在收到DESCRIBE請求後查找對應的ServerMediaSession,如果找不到,就創建一個新的,那麼這幾個對象的創建過程,從哪個開始進入新線程呢?
其實從RTSPClientSession開始,就可以放入新線程中,無非是RTSPServer要操作RTSPClientSession時進行同步保護而已.但是我還發現一個問題,那就是RTSPServer中並沒有保存RTSPClientSession的列表.RTSPClientSession被創建出來就不管了,哦!從RTSPClientSession開始進入另外線程真是絕佳的時機!那RTSPClientSession被保存在哪裏呢?它其實最終被保存在ServerMediaSusession的stremstate中了.當一個流播放完畢時,它自然就要被銷燬了,是吧?


但是還有問題:RTSPServer中還擔負者查找所有ServerMediaSession的任務,當然它是受RTSPClientSession委託的,因爲ServerMediaSession們保存在RTSPServer中是理所當然的事.如果RTSPClientSession在不同的線程中呢?RTSPClientSession再查找ServerMediaSession就要進行同步保護了.還有個更嚴重的問題:我們希望把各個StreamState分散到不同的線程中,但它們又被保存在ServerMediaSub session中,麻煩又來了...


如果把ServerMediaSession保存到不同的線程中呢?看起來是可以的!但是又帶來了問題,一個線程中的RTSPClientSession只能在自己線程的ServerMediaSession列表中查找是否已存在某個ServerMediaSession,其它線程中即使已存在了,也不能用,只能另創建一個,因爲RTSPClientSession在被創建後應馬上找到其UsageEnvironment,否則它就不能利用event loop接收數據了.所以ReuseSource是否能真正起作用,只能靠運氣了.可不可以這樣:先在主線程中執行RTSPClientSession的OPTION和DESCRIBE響應,再跟據其ServerMediaSession所在的線程,把它移到那個線程中去?我認爲,這是完全能夠做到的!看起來這樣做,似乎有點完美了....
當然真正的實現上,如果能做到各線程之間的交互只是把DelayTask Handle放到目的線程的EventLoop中的話,並行計算的能力就真的要發揮出來了.

轉自: http://blog.csdn.net/niu_gao/article/details/7034414

發佈了7 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章