圖解程式執行緒、互斥鎖與訊號量-看完不懂你來打我

字母哥部落格發表於2020-09-06

在上學的時候,老師講到程式與執行緒的時候可能是這樣講的:

  • 程式是一個具有一定獨立功能的程式在一個資料集上的一次動態執行的過程,是作業系統進行資源分配和排程的一個獨立單元,是應用程式執行的載體。
  • 執行緒是程式執行中一個單一的順序控制流程,是程式執行流的最小單元,是處理器排程和分派的基本單位。一個程式可以有一個或多個執行緒,各個執行緒之間共享程式的記憶體空間(也就是所在程式的記憶體空間)。

那個時候為了考試我都背下來了,但是心裡想說:what?這都是些什麼東西? 下面讓我來試著用更通俗的語言來給你說說程式、執行緒、互斥鎖、訊號量的那些事。

一、房子與居住者

我們可以將自己平時住的房子類比為一個程式,每一個房間及其佔用者比喻為一個執行緒。房子本身並不會做任何的事情,但是執行緒是房子裡面每一個活躍的人,他們平時洗衣、做飯、看電視……,就像執行緒執行自己的程式碼一樣在執行著。

單執行緒
單執行緒就是一個叫做“程式”的房子裡面,只住了你一個人,你可以在這個房子裡面任何時間去做任何的事情。你是看電視、還是玩電腦,全都有你自己說的算。想幹什麼幹什麼,想什麼時間做什麼就什麼時間做什麼。

多執行緒
但是如果你處在一個“多人”的房子裡面,每個房子裡面都有叫做“執行緒”的住戶:執行緒1、執行緒2、執行緒3、執行緒4,情況就不得不發生變化了。假如這些執行緒是你的老婆、孩子、父母。

  • 父母老人午睡的時候你不能開音響
  • 老婆要看“甄嬛傳”,你就不能看球賽
  • 孩子沒睡覺,你就別想看書
  • ……

多執行緒出現這些問題的根本原因在於”共享資源“:時間、電視、廁所、廚房……等等。那我們下面來看看,如何處理協調使用這些"共享資源"?

二、鎖(互斥鎖)

在多執行緒程式設計中有”鎖”的概念,在你的房子裡面也有鎖。如果你的老婆在上廁所並鎖上門,她就是在獨享這個“房子(程式)”裡面的公共資源“衛生間”,如果你的家裡只有這一個衛生間,你作為另外一個執行緒就只能先等待。

執行緒對鎖的佔用是有優先順序的,就像在你的家裡也有優先順序。當你家只有一個衛生間的時候,孩子、老婆、你同時要去上廁所,通常來說 你的優先順序是1,你老婆的優先順序是100,你孩子的優先順序是255。需要說明的是:數值越小優先順序越低。但是不同的情況下會有不同的優先順序排程演算法,關鍵核心因子是優先順序設定與等待時間,如果你確實等待了很長時間,老婆孩子可能看你快憋不住了,讓你先去使用洗手間也是可以的。

三、訊號量

現在讓我們從衛生間走入廚房,首先我們要明確的一點是:廚房裡面可以有一個人,也可以有多個人。
那我們怎麼控制使用“廚房”這個公共資源的人數(執行緒數)?一個比較好的方法就是使用訊號量。

“訊號量”在程式設計術語中使用單詞semaphore,那什麼是“訊號量”?訊號量就好比你家廚房入口架子上擺了三把鍋:

  • 如果你的孩子熱奶拿走一把,你的老婆熱湯拿走一把,你的媽媽做菜拿走一把,你想煮麵條就沒有鍋了。當你看到這種情況,你就不會進入廚房了,也就說廚房按照“鍋的數量”作為訊號量,只能容納三個人(執行緒)。
  • 當你的老婆熱完湯之後,把鍋重新放回架子上,你就可以去獲得一個鍋,你就可以進入廚房了。

所以說:當訊號量總數為1的時候,也就是你家只有一把鍋,此時訊號量作用就等同於互斥鎖。

四、專業點好麼

來一張專業點的圖,別讓您誤會我是講故事的。講技術,我可是認真的!

歡迎關注我的部落格,裡面有很多精品合集

  • 本文轉載註明出處(必須帶連線,不能只轉文字):字母哥部落格

覺得對您有幫助的話,幫我點贊、分享!您的支援是我不竭的創作動力! 。另外,筆者最近一段時間輸出瞭如下的精品內容,期待您的關注。

相關文章