互斥鎖 自旋鎖 讀寫鎖 遞歸鎖



互斥鎖(mutexlock):

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

自旋鎖(spinlock):

同樣用來標記只能有一個線程訪問該對象,在同一線程多次加鎖操作會造成死鎖使用硬件提供的swap指令或test_and_set指令實現;同互斥鎖不同的是在鎖操作需要等待的時候並不是睡眠等待喚醒,而是循環檢測保持者已經釋放了鎖,這樣做的好處是節省了線程從睡眠狀態到喚醒之間內核會產生的消耗,在加鎖時間短暫的環境下這點會提高很大效率

讀寫鎖(rwlock):

高級別鎖,區分讀和寫,符合條件時允許多個線程訪問對象。處於讀鎖操作時可以允許其他線程和本線程的讀鎖, 但不允許寫鎖, 處於寫鎖時則任何鎖操作都會睡眠等待;常見的操作系統會在寫鎖等待時屏蔽後續的讀鎖操作以防寫鎖被無限孤立而等待,在操作系統不支持情況下可以用引用計數加寫優先等待來用互斥鎖實現。 讀寫鎖適用於大量讀少量寫的環境,但由於其特殊的邏輯使得其效率相對普通的互斥鎖和自旋鎖要慢一個數量級;值得注意的一點是按POSIX標準 在線程申請讀鎖並未釋放前本線程申請寫鎖是成功的,但運行後的邏輯結果是無法預測

遞歸鎖(recursivelock):

嚴格上講遞歸鎖只是互斥鎖的一個特例,同樣只能有一個線程訪問該對象,但允許同一個線程在未釋放其擁有的鎖時反覆對該鎖進行加鎖操作; windows下的臨界區默認是支持遞歸鎖的,而linux下的互斥量則需要設置參數PTHREAD_MUTEX_RECURSIVE_NP,默認則是不支持

發佈了10 篇原創文章 · 獲贊 11 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章