首頁  >  文章  >  運維  >  Linux多線程及多線程並發訪問同一塊記憶體的問題怎麼解決

Linux多線程及多線程並發訪問同一塊記憶體的問題怎麼解決

WBOY
WBOY轉載
2023-05-17 17:26:232096瀏覽

為什麼需要多執行緒?

  • 並行實體共享同一個位址空間和所有可用資料的這種能力是多進程鎖無法表達的,因為多進程具有不同的位址空間;

  • #線程比進程更加輕量級,更加快速;

  • 需要大量IO處理和計算時,擁有多線程,能夠很明顯地提升效能;

  • 在多CPU系統中,多執行緒是有益的,在這樣的系統中,能夠真正實現物理上的多執行緒並行運行;

多執行緒的優點

  • 加快程式回應速度;

  • #當目前無需要處理的任務時,可將處理器時間讓給其他任務;

  • 佔用大量處理時間的任務可以定期將處理器時間讓給其他任務;

  • ##可以隨時停止任務;

  • 可以分別設定各個任務的優先順序以優化效能;

#最佳應用程式場景

  • ##耗時或大量佔用處理器的任務阻塞使用者介面操作;

  • 各個任務必須等待外部資源;(如遠端連線或INternet連線)

#多執行緒的缺點

等待使用共用資源時會使得程式的運作速度變慢,這些共用資源主要是獨佔性資源,如印表機;Linux多線程及多線程並發訪問同一塊記憶體的問題怎麼解決

對執行緒進行管理需要額外的CPU開銷;

#執行緒的死鎖,即較長時間等待或資源競爭,

#對公有變數的同時讀或寫往往會產生無法預知的錯誤

Linux多線程及多線程並發訪問同一塊記憶體的問題怎麼解決#驗證思路

對同一個全域變數(初始值為0 ),使用五個線程函數進行操作,每個線程函數1000次,因此,我們5個線程就應該5000次,最後該全域變數的值應該是5000。

######執行不同次的嘗試,結果發現 wg 值有時為 5000,有時為 4997 或 4998。 #########原因是:#########我們對wg ,不是原子操作,轉換為指令,有多條指令構成,電腦執行的二進位的指令對變數的自增這一操作分了很多步驟,例如有兩條線程對wg ######但是不是一下子可以完成,先將val讀過來,再,再讀回去,這個操作還沒結束,另外一個線程也把wg讀過來, ,再讀回去。有可能兩個執行緒對wg=1;進行加加,最後值卻為2。 ######我們不能只停留在程式碼層面考慮問題,我們還需要考慮程式碼運行的環境,觀察我們虛擬機的設定發現:有4個處理器,至少有兩個處理器有處理其他線程,存在一個執行緒放在2個處理器上的情況,同時訪問,出現小於5000的機率比較高,這也是因為並行執行引起的。 ###############只啟用一個處理器後,只有一個執行緒在執行,其他四個執行緒肯定沒有執行,不存在同時執行兩個執行緒的情況。 ######出現小於5000的機率很小(這個原因是,把val值1讀過來,還沒來得及回去,這個時候時間片到了,發生了切換,換到其餘線程,讀過來還是1,加加,現場恢復,還是1進行加加,這種場景出現的機率非常小)1個處理器不能並行的。 ###

以上是Linux多線程及多線程並發訪問同一塊記憶體的問題怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除