這陣子學習多執行緒方面的知識發現自己對於一些基本概念都還不清楚。
比如訊號量和互斥鎖這塊。看網上的資料越看越亂。偶然看到一篇對訊號量和互斥鎖的形象比喻,拷貝下來供自己學習學習。
這個比喻是解釋訊號量(semaphore)和互斥鎖(mutex)的區別。該比喻最初來自這裡,我先翻譯一下,然後對它做個改進。
互斥鎖是一把公共廁所的鑰匙。乙個人使用廁所的時候可以拿到這把鑰匙,用完之後把這把鑰匙交給排隊的下乙個人。
訊號量是沒有人使用的廁所的鑰匙數量,所有廁所的鑰匙都一樣。比如有4個廁所有相同的鑰匙和鎖。訊號量的值就是鑰匙的數量,一開始是4。當進來乙個人的時候數量就是少乙個,如果4個廁所都滿了,訊號量就成0了,出去乙個人就增加1,並把鑰匙交給排隊的下乙個人。
這個比喻並不是太好,尤其是它無法解釋 二元(binary)訊號量和互斥鎖的區別!我把這個比喻做了改進。互斥鎖的比喻還是和上面一樣,需要指出的是,當你拿到那把鑰匙的時候你就是它的擁有者(owner),別人是無法開啟廁所門的。
而訊號量到底是什麼呢?它就是乙個大的公共廁所,裡面有若干個位置,外面的大門口有乙個可以翻動牌子寫著「已滿」和「可用」,當裡面還有空的位置的時候,進去的人不用翻動這個牌子,直到沒有位置時最後乙個進去的人必須把它設成「已滿」,這時後面的人必須排隊等候,然後出去的人必須把牌子翻到「可用」,如果需要的話。
很好理解對嘛?那麼它怎麼解釋二元訊號量呢?也就是當這個廁所裡面只能容納乙個人的時候,每個人進去的時候都要把門口的牌子翻到「已滿」,出去的時候翻到「可用」。它和互斥鎖的區別馬上就可以看出來了,翻動的牌子在外面可以被別人翻的,而鎖住的鎖只有拿鑰匙的人才可以開!
當然了,訊號量之所以翻譯成「訊號」,還是有道理的,因為它(廁所門口的牌子)標示的是資源(廁所空位)的狀態,而互斥鎖就是鎖,它實實在在地鎖住了資源。這在生產者消費者的情況下區別更明顯。
訊號量和互斥鎖
概念 訊號量用在多執行緒多工 同步的,乙個執行緒完成了某乙個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作 大家都在sem wait的時候,就阻塞在那裡 互斥鎖是用在多執行緒多工 互斥的,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法訪問,直到這個執行緒unlock,其他的執行緒才開始可...
訊號量,互斥鎖
注 摘自 程式設計師的自我修養 相關章節。關鍵字 執行緒同步 原子操作 鎖 二元訊號量 訊號量 互斥量 臨界區 讀寫鎖 條件變數 原子操作 共享資料 全域性變數或堆變數 的自增 操作在多執行緒環境下會出現錯誤是因為這個操作 一條c語句 被編譯為彙編 後不止一條指令,因此在執行的時候可能執行了一半就被...
訊號量 互斥鎖
訊號量與普通整型變數的區別 訊號量 semaphore 是非負整型變數,除了初始化之外,它只能通過兩個標準原子操作 wait semap signal semap 來進行訪問 操作也被成為pv原語 p 於dutch proberen 測試 v 於 dutch verhogen 增加 而普通整型變數則...