C++面向對象多線程學習筆記_線程處理面向對象架構

軟件架構表示整個軟件的結構,與數據組織與執行流程相關,它反映設計思想、開發方法學以及域模型。

1. 多線程架構

多線程軟件架構是一種將工作模式分解為兩個或更多并發執行線程的軟件架構。分解軟件是分割為單獨邏輯任務的過程,供軟件的工作模式來執行,其中部分任務分配給不同的執行線程,當這些線程允許同步或并發地在單進程內執行時,軟件就具有多線程架構。

對話(session)為最大的執行單元,它包含一個或多個可以并發執行的進程。當多個進程并發執行時,對話就是多任務或多進程。一個進程包含一個或多個線程。當一個進程內有兩個或更多線程并發執行時,進程就是多線程(或稱多線程化)。一個線程包含一條或多條指令,當一個線程內包含一條或多條并發執行的指令時,這些指令共同形成了一個算法,我們稱這套指令為并行算法(parallel algorithm)。

2. 使用多線程的常見架構

在應用程序中使用多線程處理的目標之一是精選出具有內在并發性和并行性的架構。通過這種方式,軟件開發者不必強迫應用程序的邏輯使用多線程化模型。至于多線程處理,功能必須服從形式。應當搜尋和使用那些天生就適合于多線程處理的架構。如果對于研究域不存在這些的架構,則必須創建這樣的架構。有一些天生就適合于多線程處理的常見架構,如下是其中的三種。

a. 客戶機/服務器; b. 事件驅動編程(GUI); c. 黑板(blackboard)。

C/S范例將工作模式分為由進程或線程表示的兩端。一端(即客戶機)請求數據或動作,另一端(即服務器)完成該請求。

3. 黑板架構

黑板是一種問題解決結構,與專家系統一樣,黑板設計用于解決特定的問題,由此生成的解決方案也只針對該問題才有用。

黑板架構由兩個基本組件構成: a. 黑板數據結構; b. 知識源。

通過知識源,在問題解決過程中協作使用黑板。知識源是一個具有特定域過程化知識、陳述性知識或兩者兼有的軟件組件。它也包含一個或多個推理引擎,可以工作于所包含的過程化或陳述性知識之上。

黑板模型是多線程技術的理想之選,它的臨界區可以受互斥量和條件變量的保護。可以將每個知識源分配給一個單獨的線程。

知識源所執行的處理過程可能要消耗很多的處理器時間。就像在邏輯服務器中一樣,知識源可以執行演繹、歸納或推測。這種推理可能包含上千次推論與假設過程。我們并不希望序列化在這種條件下知識源所做的處理過程。特別是,一個知識源的輸入可能是另一個知識源的輸出。它們經常重復和遞歸性地一起工作。有時,它們也可能以一個分享的方式工作。不過,唯一發生的交互就是通過黑板數據結構,它是一個臨界區。

4. 途徑上的不同(面向對象與過程化)

過程化編程方式的特點是在系統開發中使用自頂向下(top-down)、逐步求精法(stepwise refinement approach)。在自頂向下方式中,系統或應用程序用單個主過程來描述。然后將這個過程分解成邏輯子過程(logical subprocedure)。這些邏輯子過程被進一步分解成邏輯子過程。這個分解過程一直持續到整個應用程序能夠在程序語句級進行描述。在過程化編程方式中,將應用程序看作過程和函數的集合。

在過程化編程中,在將應用程序分解為函數部分時,幾乎不考慮所使用的數據結構和數據庫。數據只被看作應用程序中過程和函數所使用的對象而已。應用程序以過程為中心。在多線程應用程序中的主要缺陷是競爭條件和死鎖,它們都以數據和資源為焦點,而正是臨界區(數據)和資源(數據和設備)的誤用才導致多線程序應用程序出現問題。多線程的過程化方式因為是以函數為中心,而不是以數據為中心,所以才存在缺陷。

在多線程應用程序中,任何非常量數據都有可能成為一個臨界區。在中型到大型的多線程應用程序中,如何才能成功管理臨界區以及其它共享資源呢?可以使用面向對象編程技術來解決多線程應用程序中大部分管理臨界區及其它共享資源的問題。適當使用封裝來組合互斥類和事件類與即將在多線程環境中使用的所有類,這是控制競爭條件的最有效可行方法之一。

我們可以使用C++的封裝機制提高多線程應用程序的可靠性,其途徑至少有以下兩種:

a. 在C++類中封裝互斥量和條件變量,只提供成員函數的訪問權限;

b. 通過繼承或復合結合互斥量或條件變量類與宿主類。

當多線程處理面向對象架構時,轉移責任給我們帶來了一個重要的途徑。同步對象訪問以及保護對象臨界區的責任應用從對象的用戶身上轉移到對象的提供者身上。對象的用戶不用費心去規劃對象具有的臨界區,在使用私有屬性時,對象的提供者必須提供同步和保護措施。

對于可能應用于多線程環境中的類,我們必須包含對象訪問策略。提供對多線程處理的支持以及對類的臨界區的保護是類提供者的一部分責任。如果打算將類用于多線程應用程序中,則必須為類中的臨界區指定訪問策略。類的設計者必須提供類的相應并發模型。

為了開發支持并發的面向對象架構,C++程序員可以首先,在一套低層類中封裝特定系統的功能性,低層類例如線程類和互斥類,同時,在低層類的上層構建高層類。最后,最高層類的用戶中只能看到一般性的并發模型。

5. 增量多線程處理

一旦設計者為類選定了并發訪問策略,必須相應地設計該類的成員函數,使得類用于多線程環境中時,強制實施并發訪問策略。這要求與類連接的同步類應當用于正確保護臨界區。它還要求設計者將類的數據組件分割成可以并發修改和訪問的部分以及不能如此做的部分。鎖定和取消鎖定通過所需的成員函數來完成。用信號通知和廣播由所需的成員函數來完成。通過類成員函數實現類的訪問策略后,該類就可以用作一個任務類、線程類或應用框架中的組件了。

在設計方,它從選定適宜于多線程處理的架構開始,一旦選定了架構,然后設計應用框架。應用框架設計完畢,再設計支持應用框架的類庫和容器類。類庫、容器類和域類都是基于同步類而構建。

在實現方,從最低層的類開始,向最高層類推進。它是一種構建塊途徑來多線程處理C++組件。它不是試圖強迫應用于多個線程,而是選定一個自然而然適宜于多線程處理的架構。然后,我們用一些提供了同步和協調的組件來填充這些架構。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容