Linux之多線程以及多線程并發(fā)訪問同一塊內存的處理問題
為什么需要多線程?
- 并行實體共享同一個地址空間和所有可用數(shù)據(jù) 的這種能力是多進程鎖無法表達的,因為多進程具有不同的地址空間;
- 線程比進程更加輕量級,更加快速;
- 需要大量IO處理和計算時,擁有多線程,能夠很明顯地提升性能;
- 在多CPU系統(tǒng)中,多線程是有益的,在這樣的系統(tǒng)中,能夠真正實現(xiàn)物理上的多線程并行運行;
之前我們學習了線程庫內置函數(shù)的一些使用,接下來我們來討論多線程在并發(fā)執(zhí)行過程中的一些問題,我們采取訪問同一塊內存的方式來探究。
多線程的優(yōu)點
- 加快程序響應速度;
- 當前無需要處理的任務時,可將處理器時間讓給其他任務;
- 占用大量處理時間的任務可以定期將處理器時間讓給其他任務;
- 可以隨時停止任務;
- 可以分別設置各個任務的優(yōu)先級以優(yōu)化性能;
最佳應用場景
- 耗時或大量占用處理器的任務阻塞用戶界面操作;
- 各個任務必須等待外部資源;(如遠程連接或INternet連接)
多線程的缺點
- 等候使用共享資源時會使得程序的運行速度變慢,這些共享資源主要是獨占性資源,如打印機;
- 對線程進行管理需要額外的CPU開銷;
- 線程的死鎖,即較長時間等待或資源競爭,
- 對公有變量的同時讀或寫往往會產(chǎn)生無法預知的錯誤
驗證思路
對同一個全局變量(初始值為0),使用五個線程函數(shù)進行++操作,每個線程函數(shù)++1000次,因此,我們5個線程就應該++5000次,最后該全局變量的值應該為5000。
然而不同次的嘗試執(zhí)行,卻發(fā)現(xiàn)最終wg的值有時候是5000,有時候又是4997,4998。
原因是:
我們對wg++,并不是原子操作,轉換為指令,有多條指令構成,計算機執(zhí)行的二進制的指令對變量的自增這一操作分了很多步驟,比如有兩條線程對wg++
但是++不是一下子可以完成,先將val讀過來,再++,再讀回去,這個操作還沒結束,另外一個線程也把wg讀過來,++,再讀回去。有可能兩個線程對wg=1;進行加加,最后值卻為2。
我們不能僅僅停留在代碼層面考慮問題,我們還需要考慮代碼運行的環(huán)境,觀察我們虛擬機的設置發(fā)現(xiàn):有4個處理器,至少有兩個處理器有處理其他線程,存在一個線程放在2個處理器上的情況,同時訪問,出現(xiàn)小于5000的概率比較高,這也是因為并行執(zhí)行引起的。
調成1個處理器,此時的5個線程,只有1個線程執(zhí)行,其余4個肯定沒有執(zhí)行,不出現(xiàn)同時執(zhí)行兩個線程的情況。
出現(xiàn)小于5000的概率很小(這個原因是,把val值1讀過來,還沒來得及++回去,這個時候時間片到了,發(fā)生了切換,換到其余線程,讀過來還是1,加加,現(xiàn)場恢復,還是1進行加加,這種場景出現(xiàn)的概率非常?。?個處理器不能并行的。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
CentOS 7更新時出現(xiàn):Multilib version problems問題的解決方法
這篇文章主要給大家介紹了關于CentOS 7系統(tǒng)更新時出現(xiàn):Multilib version problems問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧。2017-11-11詳解CentOS安裝tomcat并且部署Java Web項目
本篇文章主要介紹了CentOS安裝tomcat并且部署Java Web項目,具有一定的參考價值,有需要的可以了解一下。2016-11-11