[cpp] view plaincopyprint?
訊號量/互斥體允許程序睡眠屬於睡眠鎖,自旋鎖則不允許呼叫者睡眠,而是讓其迴圈等待,所以有以下區別應用
1)、訊號量和讀寫訊號量適合於保持時間較長的情況,它們會導致呼叫者睡眠,因而自旋鎖適合於保持時間非常短的情況
2)、自旋鎖可以用於中斷,不能用於程序上下文(會引起死鎖)。而訊號量不允許使用在中斷中,而可以用於程序上下文
3)、自旋鎖保持期間是搶占失效的,自旋鎖被持有時,核心不能被搶占,而訊號量和讀寫訊號量保持期間是可以被搶占的
另外需要注意的是
1)、訊號量鎖保護的臨界區可包含可能引起阻塞的**,而自旋鎖則絕對要避免用來保護包含這樣**的臨界區,因為阻塞意味 著要進行程序的切換,如果程序被切換出去後,另一程序企圖獲取本自旋鎖,死鎖就會發生。
2)、在你占用訊號量的同時不能占用自旋鎖,因為在你等待訊號量時可能會睡眠,而在持有自旋鎖時是不允許睡眠的。
訊號量和互斥體之間的區別
概念上的區別:
訊號量:是程序間(執行緒間)同步用的,乙個程序(執行緒)完成了某乙個動作就通過訊號量告訴別的程序(執行緒),別的程序(執行緒)再進行某些動作。有二值和多值訊號量之分。
互斥鎖:是執行緒間互斥用的,乙個執行緒占用了某乙個共享資源,那麼別的執行緒就無法訪問,直到這個執行緒離開,其他的執行緒才開始可以使用這個共享資源。可以把互斥鎖看成二值訊號量。
上鎖時:
訊號量: 只要訊號量的value大於0,其他執行緒就可以sem_wait成功,成功後訊號量的value減一。若value值不大於0,則sem_wait阻塞,直到sem_post釋放後value值加一。一句話,訊號量的value>=0。
互斥鎖: 只要被鎖住,其他任何執行緒都不可以訪問被保護的資源。如果沒有鎖,獲得資源成功,否則進行阻塞等待資源可用。一句話,執行緒互斥鎖的vlaue可以為負數。
使用場所:
訊號量主要適用於程序間通訊,當然,也可用於執行緒間通訊。而互斥鎖只能用於執行緒間通訊。
from :
訊號量與自旋鎖 2 訊號量和互斥體
1.引言 下面我們研究如何為共享資源新增鎖定.我們的目的是使所有對共享資源的操作都是原子的,也就是說,在操作該共享資源的其他執行緒執行前,本執行緒對該資源的整個操作就已經完成了.對我們下面要說的記憶體洩露的舉例來說,需要確保當乙個執行緒 如b 發現特定記憶體塊需要分配時,它擁有執行分配的執行權力,並...
自旋鎖,互斥鎖,訊號量
自旋鎖,互斥鎖,訊號量 樂觀鎖和悲觀鎖只是一種理論,是從思想上劃分的。自旋鎖和互斥鎖是應用層確確實實的鎖,用於同步訪問控制 如果一定要劃分,從只有乙個執行緒可以擁有鎖來說,我覺得自旋鎖和互斥鎖應該都屬於悲觀鎖,因為一般的應用不需要支援事物回滾的操作。但是沈詢的直播中說,互斥鎖屬於悲觀鎖 sleep ...
訊號量,互斥鎖,自旋鎖
個人理解 訊號量 程序間的通訊機制 單一個數的訊號 與訊息郵箱,訊息佇列,機理類同,量不同,用訊號量肯定掉cpu 自旋鎖 保護區域不掉cpu,持續查詢,等待 不可用時域長狀態 切記 時域範圍 在程序間的通訊機制函式狀態 鎖 0 互斥鎖與自旋鎖 互斥鎖 執行緒會從sleep 加鎖 running 解鎖...