linux多线程编程实例(linux 多线程编程)
Linux多線程通信?
PIPE和FIFO用來實(shí)現(xiàn)進(jìn)程間相互發(fā)送非常短小的、頻率很高的消息;
這兩種方式通常適用于兩個進(jìn)程間的通信。
共享內(nèi)存用來實(shí)現(xiàn)進(jìn)程間共享的、非常龐大的、讀寫操作頻率很高的數(shù)據(jù)(配合信號量使用);
這種方式通常適用于多進(jìn)程間通信。
其他考慮用socket。這里的“其他情況”,其實(shí)是今天主要會碰到的情況:
分布式開發(fā)。
在多進(jìn)程、多線程、多模塊所構(gòu)成的今天最常見的分布式系統(tǒng)開發(fā)中,
socket是第一選擇
。
消息隊(duì)列,現(xiàn)在建議不要使用了 ---- 因?yàn)檎也坏绞褂盟鼈兊睦碛伞?/p>
在實(shí)際中,我個人感覺,PIPE和FIFO可以偶爾使用下,共享內(nèi)存都用的不多了。在效率上說,socket有包裝數(shù)據(jù)和解包數(shù)據(jù)的過程,所以理論上來說socket是沒有PIPE/FIFO快,不過現(xiàn)在計(jì)算機(jī)上真心不計(jì)較這么一點(diǎn)點(diǎn)速度損失的。你費(fèi)勁糾結(jié)半天,不如我把socket設(shè)計(jì)好了,多插一塊CPU來得更劃算。
另外,進(jìn)程間通信的數(shù)據(jù)一般來說我們都會存入數(shù)據(jù)庫的,這樣萬一某個進(jìn)程突然死掉或者整個服務(wù)器死了,也不至于丟失重要數(shù)據(jù)、便于回滾到之前的狀態(tài)。從這個角度考慮,適用共享內(nèi)存的情況也更少了,所以socket使用得更多。再多說一點(diǎn)關(guān)于共享內(nèi)存的:共享內(nèi)存的效率確實(shí)高,但它的重點(diǎn)在“共享”二字上。如果的確有好些進(jìn)程共享一大塊數(shù)據(jù)(如果把每個進(jìn)程都看做是類的對象的話,那么共享數(shù)據(jù)就是這個類的static數(shù)據(jù)成員),那么共享內(nèi)存就是一個不二的選擇了。但是在面向?qū)ο蟮慕裉欤覀兏嗟臅r候是多線程+鎖+線程間共享數(shù)據(jù)。因此共享進(jìn)程在今天使用的也越來越少了。
不過,在面對一些極度追求效率的需求時,共享內(nèi)存就會成為唯一的選擇,比如高頻交易系統(tǒng)。除此以外,一般是不需要特意使用共享內(nèi)存的。另外,
PIPE和共享內(nèi)存是不能跨LAN的
(FIFO可以但FIFO只能用于兩個進(jìn)程通信)
。
如果你的分布式系統(tǒng)隨著需求的增加而越來越大所以你想把不同的模塊放在不同機(jī)器上而你之前開發(fā)的時候用了PIPE或者共享內(nèi)存,那么你將不得不對代碼進(jìn)行大幅修改......同時,即使FIFO可以跨越LAN,其代碼的可讀性、易操作性和可移植性、適應(yīng)性也遠(yuǎn)沒有socket大。這也就是為什么一開始說socket是第一選擇的原因。
最后還有個信號簡單說一下。
請注意,是信號,不是信號量。
信號量是用于同步線程間的對象的使用的(建議題主看我的答案,自認(rèn)為比較通俗易懂:
semaphore和mutex的區(qū)別? - Linux - 知乎
)。
信號也是進(jìn)程間通信的一種方式。比如在Linux系統(tǒng)下,一個進(jìn)程正在執(zhí)行時,你用鍵盤按Ctrl+c,就是給這個進(jìn)程發(fā)送了一個信號。進(jìn)程在捕捉到這個信號后會做相應(yīng)的動作。
雖然信號是可以自定義的,但這并不能改變信號的局限性:不能跨LAN、信息量極其有限
。
在現(xiàn)代的分布式系統(tǒng)中,通常都是消息驅(qū)動:
即進(jìn)程受到某個消息后,通過對消息的內(nèi)容的分析然后做相應(yīng)的動作。如果你把你的分布式系統(tǒng)設(shè)置成信號驅(qū)動的,這就表示你收到一個信號就要做一個動作而一個信號的本質(zhì)其實(shí)就是一個數(shù)字而已。這樣系統(tǒng)稍微大一點(diǎn)的話,系統(tǒng)將變得異常難以維護(hù);甚至在很多時候,信號驅(qū)動是無法滿足我們的需求的。
因此現(xiàn)在我們一般也不用信號了。因此,請記住:
除非你有非常有說服力的理由,否則請用socket。
順便給你推薦個基于socket的輕量級的消息庫:ZeroMQ。
想要學(xué)習(xí)C++多線程編程,要用什么教材比較好?
多線程編程基本上是api的使用,看你基于什么平臺和編程工具。Linux下和Windows下的api不太一樣。
多線程編程的重點(diǎn)在于,公共數(shù)據(jù)的訪問。
公共數(shù)據(jù)訪問一般通過互斥鎖,信號量,條件變量等方式實(shí)現(xiàn)公共數(shù)據(jù)的訪問和線程運(yùn)行的控制。
任何一本多線程編程書籍都會講這個概念,剩下的就是特點(diǎn)平臺的編程了。
linux多線程詳解?
1.進(jìn)程是操作系統(tǒng)分配資源的基本單位。而線程通俗來講就是一個進(jìn)程中一個執(zhí)行流。
2.這里以串行與并行下載文件舉例,如果我們使用串行的方式去下載多個文件,那么得到的結(jié)果是,將這些文件逐個按個的下載,即上一個下載完成之后才會下載接下來的文件。
3.如果使用并行的方式下載,那么這些文件就會一次同時下載多個文件,而不是等待上一個下載完后才繼續(xù)下載接下來的,大大的提高了下載效率。
linux使用?
1.linux:
一種開源的,免費(fèi)的操作系統(tǒng),安裝在計(jì)算機(jī)硬件上,用來管理計(jì)算機(jī)的硬件和軟件資源的系統(tǒng)軟件
linux注重安全性,穩(wěn)定性,高并發(fā)處理能力
linux沒有優(yōu)異的可視化界面
windows用于個人計(jì)算機(jī),linux通常用于企業(yè)服務(wù)器上
任何使用linux的系統(tǒng)資源用戶,必須使用一個合法的賬號和密碼
使用linux的常用命令有:
1.查看當(dāng)前所在目錄:pwd
2.查看指定目錄下的文件和文件列表:ls 指定文件
比如:ls /home
3. ls -l /home:以列表的形式顯示
4. ls -a /home:顯示指定目錄下的所有的文件和子文件(包括虛擬的目錄)
5. ls -al /home:以列表的形式顯示指定目錄下的所有的文件和子文件(包括虛擬的目錄)
6. ls |grep 單詞:過濾含有此單詞的命令并顯示出來
7. ls -l:查看權(quán)限
Linux下Qt+OpenCV多線程顯示多個視頻,該如何實(shí)現(xiàn),大神呀,求大神?
這個你先弄個線程隊(duì)列,每個線程負(fù)責(zé)讀取一個視頻的數(shù)據(jù),用來給一個視頻現(xiàn)實(shí)。因?yàn)橹皇亲x取視頻,所以不存在同步和互斥的問題,應(yīng)該很簡單啊,不知道你的問題是啥
總結(jié)
以上是生活随笔為你收集整理的linux多线程编程实例(linux 多线程编程)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抽象工厂和工厂方法示例_抽象工厂设计模式
- 下一篇: linux文件函数(linux 文件函数