Linux之多線程以及多線程并發(fā)訪問(wèn)同一塊內(nèi)存的處理問(wèn)題
為什么需要多線程?
- 并行實(shí)體共享同一個(gè)地址空間和所有可用數(shù)據(jù) 的這種能力是多進(jìn)程鎖無(wú)法表達(dá)的,因?yàn)槎噙M(jìn)程具有不同的地址空間;
- 線程比進(jìn)程更加輕量級(jí),更加快速;
- 需要大量IO處理和計(jì)算時(shí),擁有多線程,能夠很明顯地提升性能;
- 在多CPU系統(tǒng)中,多線程是有益的,在這樣的系統(tǒng)中,能夠真正實(shí)現(xiàn)物理上的多線程并行運(yùn)行;
之前我們學(xué)習(xí)了線程庫(kù)內(nèi)置函數(shù)的一些使用,接下來(lái)我們來(lái)討論多線程在并發(fā)執(zhí)行過(guò)程中的一些問(wèn)題,我們采取訪問(wèn)同一塊內(nèi)存的方式來(lái)探究。
多線程的優(yōu)點(diǎn)
- 加快程序響應(yīng)速度;
- 當(dāng)前無(wú)需要處理的任務(wù)時(shí),可將處理器時(shí)間讓給其他任務(wù);
- 占用大量處理時(shí)間的任務(wù)可以定期將處理器時(shí)間讓給其他任務(wù);
- 可以隨時(shí)停止任務(wù);
- 可以分別設(shè)置各個(gè)任務(wù)的優(yōu)先級(jí)以優(yōu)化性能;
最佳應(yīng)用場(chǎng)景
- 耗時(shí)或大量占用處理器的任務(wù)阻塞用戶界面操作;
- 各個(gè)任務(wù)必須等待外部資源;(如遠(yuǎn)程連接或INternet連接)
多線程的缺點(diǎn)
- 等候使用共享資源時(shí)會(huì)使得程序的運(yùn)行速度變慢,這些共享資源主要是獨(dú)占性資源,如打印機(jī);
- 對(duì)線程進(jìn)行管理需要額外的CPU開(kāi)銷(xiāo);
- 線程的死鎖,即較長(zhǎng)時(shí)間等待或資源競(jìng)爭(zhēng),
- 對(duì)公有變量的同時(shí)讀或?qū)懲鶗?huì)產(chǎn)生無(wú)法預(yù)知的錯(cuò)誤
驗(yàn)證思路
對(duì)同一個(gè)全局變量(初始值為0),使用五個(gè)線程函數(shù)進(jìn)行++操作,每個(gè)線程函數(shù)++1000次,因此,我們5個(gè)線程就應(yīng)該++5000次,最后該全局變量的值應(yīng)該為5000。

然而不同次的嘗試執(zhí)行,卻發(fā)現(xiàn)最終wg的值有時(shí)候是5000,有時(shí)候又是4997,4998。
原因是:
我們對(duì)wg++,并不是原子操作,轉(zhuǎn)換為指令,有多條指令構(gòu)成,計(jì)算機(jī)執(zhí)行的二進(jìn)制的指令對(duì)變量的自增這一操作分了很多步驟,比如有兩條線程對(duì)wg++
但是++不是一下子可以完成,先將val讀過(guò)來(lái),再++,再讀回去,這個(gè)操作還沒(méi)結(jié)束,另外一個(gè)線程也把wg讀過(guò)來(lái),++,再讀回去。有可能兩個(gè)線程對(duì)wg=1;進(jìn)行加加,最后值卻為2。
我們不能僅僅停留在代碼層面考慮問(wèn)題,我們還需要考慮代碼運(yùn)行的環(huán)境,觀察我們虛擬機(jī)的設(shè)置發(fā)現(xiàn):有4個(gè)處理器,至少有兩個(gè)處理器有處理其他線程,存在一個(gè)線程放在2個(gè)處理器上的情況,同時(shí)訪問(wèn),出現(xiàn)小于5000的概率比較高,這也是因?yàn)椴⑿袌?zhí)行引起的。

調(diào)成1個(gè)處理器,此時(shí)的5個(gè)線程,只有1個(gè)線程執(zhí)行,其余4個(gè)肯定沒(méi)有執(zhí)行,不出現(xiàn)同時(shí)執(zhí)行兩個(gè)線程的情況。
出現(xiàn)小于5000的概率很小(這個(gè)原因是,把val值1讀過(guò)來(lái),還沒(méi)來(lái)得及++回去,這個(gè)時(shí)候時(shí)間片到了,發(fā)生了切換,換到其余線程,讀過(guò)來(lái)還是1,加加,現(xiàn)場(chǎng)恢復(fù),還是1進(jìn)行加加,這種場(chǎng)景出現(xiàn)的概率非常小)1個(gè)處理器不能并行的。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
VMware虛擬機(jī)安裝Linux系統(tǒng)圖文教程
這篇文章主要為大家詳細(xì)介紹了VMware虛擬機(jī)安裝Linux系統(tǒng)教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
CentOS 7更新時(shí)出現(xiàn):Multilib version problems問(wèn)題的解決方法
這篇文章主要給大家介紹了關(guān)于CentOS 7系統(tǒng)更新時(shí)出現(xiàn):Multilib version problems問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-11-11
詳解CentOS安裝tomcat并且部署Java Web項(xiàng)目
本篇文章主要介紹了CentOS安裝tomcat并且部署Java Web項(xiàng)目,具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11
在windows上如何將本地文件上傳至Linux服務(wù)器
這篇文章主要介紹了在windows上如何將本地文件上傳至Linux服務(wù)器問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Linux搭建DHCP服務(wù)器的詳細(xì)過(guò)程
DHCP動(dòng)態(tài)主機(jī)配置協(xié)議是一個(gè)局域網(wǎng)的網(wǎng)絡(luò)協(xié)議,指的是由服務(wù)器控制一段IP地址范圍,客戶機(jī)登錄服務(wù)器時(shí)就可以自動(dòng)獲得服務(wù)器分配的IP地址和子網(wǎng)掩碼,這篇文章主要介紹了Linux搭建DHCP服務(wù)器,需要的朋友可以參考下2022-10-10

