16 5 訊息併發傳遞

2021-06-03 07:36:39 字數 694 閱讀 2177

16.5 訊息併發傳遞

當我們在第 14 章中討論開發併發程式時,關注的技術是避免使用可變狀態。沒有可變狀態,就可以並行地執行乙個計算的幾個部分,因為它們不會彼此干擾。這在許多能夠以函式方式實現的資料處理問題時,工作地非常好,但在處理需要更頻繁地交換資訊時,也有問題。

最廣為人知的解決方案是,使用共享記憶體(shared memory)和通過鎖定保護訪問共享的狀態。用這種技術的問題在於,正確使用鎖定是相當困難的。必須確保所有的共享記憶體都是正確鎖定(以避免爭用條件(race conditions),當多個執行緒寫入相同的位置時)。另乙個困難是,當獲得鎖時,不小心就可能引起死鎖(deadlock),兩個執行緒永遠被阻塞,每個程序都等待對方完成。

在 f# 中,mailboxprocessor<'msg> 型別可用於實現並行程式設計,使用一種被稱為訊息傳遞併發性(message passing concurrency)的技術。這種方法並未廣泛應用,但在一種函式式語言 erlang [armstrong et al., 1996] 中,是併發性的基礎,以其可擴充套件性而聞名。當我們在繪製矩形的應用程式中,把狀態儲存到郵箱時,已經看到過這種方法,但那種情況是為了探索非同步邏輯和事件處理而設計的,並不是真實的併發性。

在這一節中,我們將看使用多個執行緒中的郵箱處理器,來演示這種做法。我們將使用的示例,有乙個郵箱處理器和多個訪問它的非同步工作流(執行在多個執行緒上)。使用訊息傳遞併發性更複雜的程式,經常使用多個彼此通訊的郵箱處理器。

Erlang併發程式設計之訊息傳遞

下面是erlang教程的乙份 其中建立了兩個程序,其中乙個重複向另乙個傳送訊息。module tut15 export start 0,ping 2,pong 0 ping 0,pong pid pong pid finished,io format ping finished n ping n,p...

多程序併發程式設計 訊息傳遞伺服器

開發平台 linux,ubuntu 開發工具 gedit 開發語言 c c uc 使用技術 程序,管道,共享記憶體,套節字,訊號,檔案 專案描述 建立csocket類,封裝了套節字的建立,繫結,監聽,關閉。cepoll event類,封裝了核心事件表的建立,事件集,控制,新增,銷毀,監聽事件,建立檔...

Android訊息傳遞之元件間傳遞訊息

前言 上篇學習總結了android通過handler訊息機制實現了工作執行緒與ui執行緒之間的通訊,今天來學習一下如何實現元件之間的通訊。本文依然是為學習eventbus做鋪墊,有對比才能進步,今天主要介紹在eventbus出現之前的實現方式,通過intent方式這裡不做介紹。需求場景 方式一 通過...