1. 程式人生 > 其它 >程序和執行緒的通訊方式

程序和執行緒的通訊方式

程序間通訊

① 管道/匿名管道:存在於記憶體中的檔案,用於具有親緣關係的父子程序間或者兄弟程序之間的通訊

② 命名管道:存在於實際的磁碟介質或者檔案系統,解決只能親緣關係間程序通訊的問題,可以實現本機的任務兩個程序通訊,嚴格遵循先進先出規則

③ 訊息佇列:訊息佇列是核心中儲存訊息的連結串列,它由訊息佇列識別符號進行標識,這種方式能夠在不同的程序之間提供全雙工的通訊連線。

  管道和訊息佇列的通訊資料都是先進先出的原則,與管道不同的是訊息佇列存放在核心中,只有在核心重啟(即作業系統重啟)或者顯示地刪除一個訊息佇列時,該訊息佇列才會被真正的刪除。

  訊息佇列可以實現訊息的隨機查詢,訊息不一定要以先進先出的次序讀取,也可以按訊息的型別讀取.比 FIFO 更有優勢。

  訊息佇列克服了訊號承載資訊量少,管道只能承載無格式字 節流以及緩衝區大小受限等缺點

④ 訊號量:訊號量是一個計數器,用於多程序對共享資料的訪問,訊號量的意圖在於程序間同步。這種通訊方式主要用於解決與同步相關的問題並避免競爭條件

⑤ 共享記憶體:使得多個程序可以訪問同一塊記憶體空間,不同程序可以及時看到對方程序中對共享記憶體中資料的更新。這種方式需要依靠某種同步操作,如互斥鎖和訊號量等。可以說這是最有用的程序間通訊方式

執行緒間同步方式

① 互斥量(Mutex):採用互斥物件機制,只有擁有互斥物件的執行緒才有訪問公共資源的許可權。因為互斥物件只有一個,所以可以保證公共資源不會被多個執行緒同時訪問。比如 Java 中的 synchronized 關鍵詞和各種 Lock 都是這種機制

② 訊號量(Semphares):它允許同一時刻多個執行緒訪問同一資源,但是需要控制同一時刻訪問此資源的最大執行緒數量

③ 事件(Event) :Wait/Notify:通過通知操作的方式來保持多執行緒同步,還可以方便的實現多執行緒優先順序的比較