1. 程式人生 > >自旋鎖與訊號量的區別是什麼? 分別在什麼場景下使用?

自旋鎖與訊號量的區別是什麼? 分別在什麼場景下使用?

自旋鎖與訊號量作為同步機制,都是用來保護臨界區的,但是它們的工作方式完全不一樣。

  1. 自旋鎖只有兩種狀態,即LOCKED與UNLOCKED。
    而訊號量既可以作為互斥鎖來使用(此時具有0和1兩種狀態),也可以作為資源計數器來使用(此時為正整數,具有不同的值,例如:0,1,2,...)
  2. 程序在獲取自旋鎖時,會持續地查詢鎖的狀態(讀改寫的原子操作),若未獲取到鎖則CPU會處於一直忙等待狀態,這正是“自旋”的含義。
    程序在獲取訊號量時,如果沒有獲取到則會轉入睡眠狀態,在未來的某個時間程序被喚醒並重新獲取訊號量。
  3. 自旋鎖原本用於多核SMP環境下,在併發時進行臨界區的保護,以上第2點講到的忙等待就是這個情形下的經典操作。但是在單核環境下,其經典操作會有些不同。
    在單核的情形下,若開了搶佔功能,則其等同於SMP的環境,也需要考慮併發的問題,採用禁止搶佔來加鎖,採用使能搶佔來解鎖。
    在單核的情形下,若沒有開搶佔功能,則自旋鎖被優化為
    什麼也不做。
  4. 在中斷上下文(軟中斷,硬中斷)使用自旋鎖,需要使用帶有中斷操作的自旋鎖版本。
  5. 自旋鎖可以用在中斷上下文。
    但是訊號量不能用在中斷上下文,因為它會睡眠,這是不允許的。