2011-05-04 37 views
2

我正在開發一個多線程中間件環境。該框架基本上是一個捕獲和流媒體框架。所以它涉及到一些線程。執行線程所需的幫助監視機制

爲了讓你的線程架構的所有的簡單說明: 有用於解複用器receiveVideoDecodeVideoDisplayVideo等每個線程執行其functionlity seprate線程,爲如:
解複用器提取音頻,視頻包
receivevideo接收頭+視頻分組的有效載荷&刪除淨荷
DecodeVideo接收有效載荷&解碼淨荷分組&顯示在顯示

因此每個線程所提取的數據饋送到下一個線程的解碼的分組
DisplayVideo接收解碼的分組。線程在它們之間共享數據緩衝區,緩衝區通過使用互斥鎖和信號量進行同步。同樣,也有其它的線程來處理ananlogvideoanalogaudio

所有期間初始化產卵在但是它們仍然阻塞上的信號量和根據輸入(模擬/ digitial)選擇性信號量的螺紋發出信號,以便特定線程得到解鎖&繼續工作。在各個階段,每個線程調用一些較低級別(驅動程序調用)來獲取數據或寫入數據等。這些調用被阻塞,並且由這些調用導致的錯誤(驅動程序返回損壞的數據,驅動程序停止)應該被處理,但目前沒有處理。

我想實現一個線程監視機制其中一個線程將監視這些工作線程,如果發生錯誤情況將採取一些預防措施。據我瞭解,某些此類機制通常用於UI或MMI應用程序中的看門狗。我正在尋找類似的東西。

我使用的並行線程和無升壓或STL(它的遺留代碼,相當多的程序C++)

有關特定框架或設計圖案或開源項目裏面做類似的事情,並可能有助於與想法任何想法爲了實施我的要求?

回答

1

如果在某個工作線程中發生錯誤,使用信號系統喚醒監視線程,那該怎麼辦?您可以使用某種類型的ResetEvent來模擬信號。

當您的工作線程中發生異常時,您可以使用某些數據結構填充有關異常的數據,然後將其傳遞到監視線程。通過使用事件喚醒監視線程。

然後監控線程可以做你需要它做的事情。

我猜你不希望你的監控線程活動,除非出現問題,對吧?

+0

我能有監視線程活躍,只有在例外情況或保持清醒和投票的時候,這一切都在我的實現,但有信號問題,我需要知道的例外有發生或錯誤情況告訴我這樣,這是不可能總是像驅動程序無限期停頓或發送損壞的垃圾。 – 2011-05-04 10:59:52

+0

@Als我不確定你能否知道司機是否停車。我不知道有什麼機制可以檢測出司機是否停車。但是,您可以通過嘗試捕獲來了解是否發生異常,並且在捕獲到信號機制的內部。看到它可能是你的異常處理機制的一部分 – 2011-05-04 11:02:39

2

你能ping通線程 - 定期發送每一個消息在其通常的輸入隊列,與所有其他正常的東西交錯,要求它返回它的狀態?當每個處理程序線程獲取消息時,它會加載具有狀態信息的消息 - 從最後一次ping之後處理的消息數量,其輸入/輸出隊列的長度,上次驅動程序返回OK的時間,以及排隊狀態回到你的線程監視機制。您的TMM將不得不超時的情況下,一些線程/卡住的答案。

您可能可能只是在整個鏈中發佈一條消息,每個線程都會在不同的字段中添加自己的狀態。這意味着只有一次超時,在此之後,您的TMM將不得不檢查該消息以查看它得到的鏈條有多遠。

還有其他的一些東西 - 我喜歡在1s定時器上保持屏幕上的隊列長度和緩衝池深度。如果有東西出現,我通常可以大致分辨出它在哪裏(例如,一個池正在清空,一些隊列正在增長 - 隊列消費者被浪費了)。

RGDS, 馬丁