天天看點

學習筆記 | 互斥鎖和自旋鎖

互斥鎖(mutexlock):

  • 最常使用于線程同步的鎖;标記用來保證在任一時刻,隻能有一個線程通路該對象,同一線程多次加鎖操作會造成死鎖;
  • 臨界區和互斥量都可用來實作此鎖,通常情況下鎖操作失敗會将該線程睡眠,等待鎖釋放時被喚醒。

在多任務作業系統中,同時運作的多個任務可能都需要使用同一種資源。

  • 互斥鎖是一種簡單的加鎖的方法來控制對共享資源的通路,互斥鎖隻有兩種狀态,即上鎖( lock )和解鎖( unlock )。
  1. 原子性:把一個互斥量鎖定為一個原子操作,這意味着作業系統(或

    pthread函數庫

    )保證了如果一個線程鎖定了一個互斥量,沒有其他線程在同一時間可以成功鎖定這個互斥量;
  2. 唯一性:如果一個線程鎖定了一個互斥量,在它解除鎖定之前,沒有其他線程可以鎖定這個互斥量;
  3. 非繁忙等待:如果一個線程已經鎖定了一個互斥量,第二個線程又試圖去鎖定這個互斥量,則第二個線程将被挂起(不占用任何cpu資源),直到第一個線程解除對這個互斥量的鎖定為止,第二個線程則被喚醒并繼續執行,同時鎖定這個互斥量。

自旋鎖(spinlock):

  • 同樣用來标記隻能有一個線程通路該對象,在同一線程多次加鎖操作會造成死鎖;使用硬體提供的

    swap指令

    test_and_set指令

    實作;
  • 同互斥鎖不同的是在鎖操作需要等待的時候并不是睡眠等待喚醒,而是循環檢測保持者已經釋放了鎖,互斥量阻塞後休眠讓出cpu,而自旋鎖阻塞後不會讓出cpu,會一直忙等待,直到得到鎖。
  • 這樣做的好處是節省了線程從睡眠狀态到喚醒之間核心會産生的消耗,在加鎖時間短暫的環境下這點會提高很大效率。适用于鎖的持有時間比較短。

繼續閱讀