linux多线程编程实例(linux 多线程编程)
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。
想要學習C++多線程編程,要用什么教材比較好?
多線程編程基本上是api的使用,看你基于什么平臺和編程工具。Linux下和Windows下的api不太一樣。
多線程編程的重點在于,公共數據的訪問。
公共數據訪問一般通過互斥鎖,信號量,條件變量等方式實現公共數據的訪問和線程運行的控制。
任何一本多線程編程書籍都會講這個概念,剩下的就是特點平臺的編程了。
linux多線程詳解?
1.進程是操作系統分配資源的基本單位。而線程通俗來講就是一個進程中一個執行流。
2.這里以串行與并行下載文件舉例,如果我們使用串行的方式去下載多個文件,那么得到的結果是,將這些文件逐個按個的下載,即上一個下載完成之后才會下載接下來的文件。
3.如果使用并行的方式下載,那么這些文件就會一次同時下載多個文件,而不是等待上一個下載完后才繼續下載接下來的,大大的提高了下載效率。
linux使用?
1.linux:
一種開源的,免費的操作系統,安裝在計算機硬件上,用來管理計算機的硬件和軟件資源的系統軟件
linux注重安全性,穩定性,高并發處理能力
linux沒有優異的可視化界面
windows用于個人計算機,linux通常用于企業服務器上
任何使用linux的系統資源用戶,必須使用一個合法的賬號和密碼
使用linux的常用命令有:
1.查看當前所在目錄:pwd
2.查看指定目錄下的文件和文件列表:ls 指定文件
比如:ls /home
3. ls -l /home:以列表的形式顯示
4. ls -a /home:顯示指定目錄下的所有的文件和子文件(包括虛擬的目錄)
5. ls -al /home:以列表的形式顯示指定目錄下的所有的文件和子文件(包括虛擬的目錄)
6. ls |grep 單詞:過濾含有此單詞的命令并顯示出來
7. ls -l:查看權限
Linux下Qt+OpenCV多線程顯示多個視頻,該如何實現,大神呀,求大神?
這個你先弄個線程隊列,每個線程負責讀取一個視頻的數據,用來給一個視頻現實。因為只是讀取視頻,所以不存在同步和互斥的問題,應該很簡單啊,不知道你的問題是啥
總結
以上是生活随笔為你收集整理的linux多线程编程实例(linux 多线程编程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抽象工厂和工厂方法示例_抽象工厂设计模式
- 下一篇: linux文件函数(linux 文件函数