在實現乙個規模較大的工程時,需要多個執行緒之間互相傳遞資料,因此,點對點的通訊機制已經不能滿足需要,設定乙個比較合理的通訊架構會提高工程開發、維護的效率以及**的復用性,可讀性。
了解ros的小夥伴都知道,ros的通訊是 節點——話題——節點 的方式。每個節點代表乙個可執行模組,每個話題是一塊通訊資料記憶體,節點之間的通訊通過話題這個「中介」傳遞(訊息)。節點之間的通訊方式是,生產者(節點)發布訊息(通訊資料)到話題,需要此資料的消費者(節點)通過訂閱此訊息完成通訊。這種通訊方式又叫做分布式通訊,各個節點之間沒有耦合關係。由上面簡述可知,ros的通訊機制比較合理,因此,在我們開發乙個比較大的工程時,怎麼實現這種通訊機制?下面以作者本人開發工程的經驗,給出乙個利用多執行緒開發乙個較大工程的過程。
一:分析系統功能要求,確定工程**需要幾個執行緒。
這一步十分重要,其決定著整個工程的框架,因此,在設計整個**之前,一定要弄清楚工程需要幾個執行緒實現,一般來說,乙個執行緒實現乙個獨立的模組功能。需要說明的是,執行緒不是越多越好,除了記憶體,執行緒間資源競爭外,作業系統、cpu也會對執行緒數限制。
二:根據各個執行緒的之間的關係決定需要通訊的資料,畫公共資料區和每個執行緒的資料流圖
公共資料區存放著整個系統通訊的資料,是資料傳輸的乙個樞紐。這一步是直觀的畫出資料與各個執行緒的通訊圖,通過畫這個圖,使開發者更清楚的明了系統資料在各個執行緒的流向,更方便設計各個執行緒流程。比如,作者本人開發的系統資料流圖如下:
圖1 公共區資料與各個執行緒通訊資料流圖
從圖1可以清楚的看出,公共區資料與各個執行緒的互動。比如,對點雲去噪執行緒而言,其只需要從公共資料區獲取1相機引數和2圖源快取(類似於ros的訂閱),然後處理完放入把3去噪結果放入公共區(類似於ros的發布)。
三:設計實現公共區。
類似於ros的話題,這一步是建立乙個公共通訊記憶體。為了儲存資料以及通訊的方便,用乙個類來管理這些通訊資料。這個類中不但包含所有通訊資料(圖一),還包含所有資料的讀寫方法(圖二),類似於ros的發布和訂閱訊息。資料設計如圖,對於每個通訊資料,弄清楚其生產和消費者。
圖二 公共區資料
公共區資料的管理方法
圖三 公共區資料通訊(讀寫)管理
四:設計每個執行緒的流程圖
每個執行緒都是乙個死迴圈,根據系統的功能設計各個執行緒流程,比如系統何時模式切換、休眠等待等。
五:設計每個獨立的功能模組,封裝成類,並測試。
若干個獨立模組是組成系統的核心部分,把各個獨立的功能模組設計成類的好處是:
1:可以方便例項化測試各個功能模組。
2:方便模組的移植、重複利用。
對於每個獨立的模組,編寫乙個測試用例,用來測試其實現功能是否符合預期。
六:編寫各個執行緒的**並測試
對於各個執行緒:
在死迴圈外,例項化功能模組類;
在死迴圈內,迴圈執行從公共區獲取資料->呼叫方法->發布結果或切換模式。
七:整合除錯系統
在主線程裡例項化公共區,並把公共區位址傳入各個執行緒。首先在主線程裡逐一開啟各個執行緒,測試功能是否與預期一致;然後開啟各個執行緒,除錯系統。
C thread偽多執行緒例子(C 多執行緒相關)
以下是單執行緒多執行緒分別處理資料,其中多執行緒有可能處理不了所有資料則程式會進入死迴圈,例子中假定work能處理完所有資料 上述多執行緒例子主線程和子執行緒鎖用得非常密集,乙個地方釋放鎖下個執行緒馬上又進行上鎖 好比乙個包子只能給一條狗吃,另外四條只能光看著。實際上只能換偽多執行緒,依然是單執行緒...
多執行緒(併發)學習筆記
1,無論以哪種方式啟動乙個執行緒,要給執行緒乙個名字,對排錯 監控有幫助。2,要對執行緒interrupt做處理。3,futrure 是任務的提交者和執行者之間的通訊手段,get 會阻塞 executorservice executor executors.newsinglethreadexecut...
多執行緒併發
多執行緒併發主要有3個方面 1 同步器 主要有synchronized,reentrantlock 訊號量,門栓 countdownlatch 障柵 cyclicbarrier 交換器。2 同步容器 主要包括 對映 集 佇列 對映 concurrenthashmap,concurrentskipli...