日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Linux多线程通信?

發布時間:2023/12/1 综合教程 31 生活家
生活随笔 收集整理的這篇文章主要介紹了 Linux多线程通信? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PIPE和FIFO用來實現進程間相互發送非常短小的、頻率很高的消息;

這兩種方式通常適用于兩個進程間的通信。

共享內存用來實現進程間共享的、非常龐大的、讀寫操作頻率很高的數據(配合信號量使用);

這種方式通常適用于多進程間通信。

其他考慮用socket。這里的“其他情況”,其實是今天主要會碰到的情況:

分布式開發。

在多進程、多線程、多模塊所構成的今天最常見的分布式系統開發中,

socket是第一選擇

消息隊列,現在建議不要使用了 ---- 因為找不到使用它們的理由。

在實際中,我個人感覺,PIPE和FIFO可以偶爾使用下,共享內存都用的不多了。在效率上說,socket有包裝數據和解包數據的過程,所以理論上來說socket是沒有PIPE/FIFO快,不過現在計算機上真心不計較這么一點點速度損失的。你費勁糾結半天,不如我把socket設計好了,多插一塊CPU來得更劃算。
另外,進程間通信的數據一般來說我們都會存入數據庫的,這樣萬一某個進程突然死掉或者整個服務器死了,也不至于丟失重要數據、便于回滾到之前的狀態。從這個角度考慮,適用共享內存的情況也更少了,所以socket使用得更多。

再多說一點關于共享內存的:共享內存的效率確實高,但它的重點在“共享”二字上。如果的確有好些進程共享一大塊數據(如果把每個進程都看做是類的對象的話,那么共享數據就是這個類的static數據成員),那么共享內存就是一個不二的選擇了。但是在面向對象的今天,我們更多的時候是多線程+鎖+線程間共享數據。因此共享進程在今天使用的也越來越少了。
不過,在面對一些極度追求效率的需求時,共享內存就會成為唯一的選擇,比如高頻交易系統。除此以外,一般是不需要特意使用共享內存的。

另外,

PIPE和共享內存是不能跨LAN的

(FIFO可以但FIFO只能用于兩個進程通信)

如果你的分布式系統隨著需求的增加而越來越大所以你想把不同的模塊放在不同機器上而你之前開發的時候用了PIPE或者共享內存,那么你將不得不對代碼進行大幅修改......同時,即使FIFO可以跨越LAN,其代碼的可讀性、易操作性和可移植性、適應性也遠沒有socket大。這也就是為什么一開始說socket是第一選擇的原因。

最后還有個信號簡單說一下。

請注意,是信號,不是信號量。

信號量是用于同步線程間的對象的使用的(建議題主看我的答案,自認為比較通俗易懂:

semaphore和mutex的區別? - Linux - 知乎

)。
信號也是進程間通信的一種方式。比如在Linux系統下,一個進程正在執行時,你用鍵盤按Ctrl+c,就是給這個進程發送了一個信號。進程在捕捉到這個信號后會做相應的動作。
雖然信號是可以自定義的,但這并不能改變信號的局限性:

不能跨LAN、信息量極其有限


在現代的分布式系統中,通常都是

消息驅動:

即進程受到某個消息后,通過對消息的內容的分析然后做相應的動作。如果你把你的分布式系統設置成信號驅動的,這就表示你收到一個信號就要做一個動作而一個信號的本質其實就是一個數字而已。這樣系統稍微大一點的話,系統將變得異常難以維護;甚至在很多時候,信號驅動是無法滿足我們的需求的。
因此現在我們一般也不用信號了。

因此,請記住:

除非你有非常有說服力的理由,否則請用socket。

順便給你推薦個基于socket的輕量級的消息庫:ZeroMQ。

總結

以上是生活随笔為你收集整理的Linux多线程通信?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。