執行緒通訊機制:共享記憶體 VS 訊息傳遞
執行緒通訊機制:共享記憶體 VS 訊息傳遞
在併發程式設計中,我們必須考慮的問題時如何在兩個執行緒間進行通訊。這裡的通訊指的是不同的執行緒之間如何交換資訊。
目前有兩種方式:
1、共享記憶體
2、訊息傳遞(actor 模型)
共享記憶體
共享記憶體這種方式比較常見,我們經常會設定一個共享變數。然後多個執行緒去操作同一個共享變數。從而達到執行緒通訊的目的。例如,我們使用多個執行緒去執行頁面抓取任務,我們可以使用一個共享變數count來記錄任務完成的數量。每當一個執行緒完成抓取任務,會在原來的count上執行加1操作。這樣每個執行緒都可以通過獲取這個count變數來獲得當前任務的完成情況。當然必須要考慮的是共享變數的同步問題,這也共享記憶體容易出錯的原因所在。
這種通訊模型中,不同的執行緒之間是沒有直接聯絡的。都是通過共享變數這個“中間人”來進行互動。而這個“中間人”必要情況下還需被保護在臨界區內(加鎖或同步)。由此可見,一旦共享變數變得多起來,並且涉及到多種不同執行緒物件的互動,這種管理會變得非常複雜,極容易出現死鎖等問題。
訊息傳遞
訊息傳遞方式採取的是執行緒之間的直接通訊,不同的執行緒之間通過顯式的傳送訊息來達到互動目的。訊息傳遞最有名的方式應該是actor模型了。在這種模型下,一切都是actor,所有的actor之間的通訊都必須通過傳遞訊息才能達到。每個actor都有一個收件箱(訊息佇列)用來儲存收到其他actor傳遞來的訊息。actor自己也可以給自己傳送訊息。這才是物件導向的精髓啊!
這種模型看起來比共享記憶體模型要複雜。但是一旦碰到複雜業務的話,actor模型的優勢就體現出來了。我們還是以剛才多執行緒抓取網站為例子看一下在這種模型下如何去解決。
首先我們定義一個統計actor用來統計任務完成量。然後把多個網址(訊息方式)發給多個抓取actor,抓取actor處理完任務後傳送訊息通知統計actor任務完成,統計actor對自己儲存的變數count(這個只有統計actor才能看到)加一。
最後讓我們來總結一下這兩種通訊模式:
併發模型 | 通訊機制 | 同步機制 |
共享記憶體 |
執行緒之間共享程式的公共狀態,執行緒之間通過寫-讀記憶體中的公共狀態來隱式進行通訊。 |
同步是顯式進行的。程式設計師必須顯式指定某個方法或某段程式碼需要線上程之間互斥執行。 |
訊息傳遞(actor) |
執行緒之間沒有公共狀態,執行緒之間必須通過明確的傳送訊息來顯式進行通訊。 |
相關文章
- flutter 訊息傳遞機制Flutter
- Handler訊息傳遞機制
- 執行緒間通訊_等待/通知機制執行緒
- Handler 訊息機制以及記憶體洩漏記憶體
- Python 併發程式設計(四):詳解 Python 執行緒訊息通訊機制Python程式設計執行緒
- Java 執行緒間通訊 —— 等待 / 通知機制Java執行緒
- flutter: 執行緒通訊與訊息迴圈Flutter執行緒
- 一種go協程間記憶體零拷貝的訊息通訊機制Go記憶體
- vue---元件間傳遞訊息(父子傳遞訊息,兄弟傳遞訊息)Vue元件
- 程序間通訊(3)-共享記憶體記憶體
- 程式間通訊之共享記憶體記憶體
- Android之Handler訊息傳遞機制詳解Android
- 一起分析執行緒的狀態及執行緒通訊機制執行緒
- InheritableThreadLocal 線上程池中進行父子執行緒間訊息傳遞出現訊息丟失的解析thread執行緒
- Rabbitmq可靠訊息投遞,訊息確認機制MQ
- system-v IPC共享記憶體通訊記憶體
- Linux程式間通訊之共享記憶體Linux記憶體
- 面試官:看過Handler原始碼嗎?請簡單說說Android執行緒間訊息傳遞機制?面試原始碼Android執行緒
- 走進Java Android 的執行緒世界(三)Hander訊息機制JavaAndroid執行緒
- openharmony 多執行緒的方式有哪些?兩個worker執行緒資料如何通訊、記憶體如何共享、與Java多執行緒有什麼區別?執行緒記憶體Java
- Android Handler訊息傳遞機制:圖文解析工作原理Android
- android 訊息傳遞機制進階EventBus的深入探究Android
- Java多執行緒-執行緒通訊Java執行緒
- Java程式執行記憶體機制Java記憶體
- 阿里Android開發規範:程式、執行緒與訊息通訊阿里Android執行緒
- Java執行緒通訊Java執行緒
- libuv執行緒通訊執行緒
- 跨共識訊息格式XCM有幾種傳遞機制?
- Linux 程式間通訊之System V 共享記憶體Linux記憶體
- Redis(六)--- Redis過期策略、記憶體淘汰機制、訊息及事物Redis記憶體
- 程式間通訊——基於共享記憶體和訊號量實現共享佇列記憶體佇列
- Java之執行緒通訊Java執行緒
- Android執行緒間通訊Android執行緒
- Java多執行緒學習——執行緒通訊Java執行緒
- Flutter中訊息傳遞Flutter
- Chrome Extension 訊息傳遞Chrome
- 共享記憶體對映(linux程式與執行緒學習筆記)記憶體Linux執行緒筆記
- Java多執行緒消費訊息Java執行緒
- Java併發程式設計(04):執行緒間通訊,等待/通知機制Java程式設計執行緒