互斥鎖機制,互斥鎖與讀寫鎖區別

2021-10-24 07:16:21 字數 981 閱讀 5701

互斥鎖:mutex,用於保證在任何時刻,都只能有乙個執行緒訪問該物件。當獲取鎖操作失敗時,執行緒會進入睡眠,等待鎖釋放時被喚醒

讀寫鎖:rwlock,分為讀鎖和寫鎖。處於讀操作時,可以允許多個執行緒同時獲得讀操作。但是同一時刻只能有乙個執行緒可以獲得寫鎖。其它獲取寫鎖失敗的執行緒都會進入睡眠狀態,直到寫鎖釋放時被喚醒。 注意:寫鎖會阻塞其它讀寫鎖。當有乙個執行緒獲得寫鎖在寫時,讀鎖也不能被其它執行緒獲取;寫者優先於讀者(一旦有寫者,則後續讀者必須等待,喚醒時優先考慮寫者)。適用於讀取資料的頻率遠遠大於寫資料的頻率的場合。

自旋鎖:spinlock,在任何時刻同樣只能有乙個執行緒訪問物件。但是當獲取鎖操作失敗時,不會進入睡眠,而是會在原地自旋,直到鎖被釋放。這樣節省了執行緒從睡眠狀態到被喚醒期間的消耗,在加鎖時間短暫的環境下會極大的提高效率。但如果加鎖時間過長,則會非常浪費cpu資源。

rcu:即read-copy-update,在修改資料時,首先需要讀取資料,然後生成乙個副本,對副本進行修改。修改完成後,再將老資料update成新的資料。使用rcu時,讀者幾乎不需要同步開銷,既不需要獲得鎖,也不使用原子指令,不會導致鎖競爭,因此就不用考慮死鎖問題了。而對於寫者的同步開銷較大,它需要複製被修改的資料,還必須使用鎖機制同步並行其它寫者的修改操作。在有大量讀操作,少量寫操作的情況下效率非常高。

1)讀寫鎖區分讀者和寫者,而互斥鎖不區分

2)互斥鎖同一時間只允許乙個執行緒訪問該物件,無論讀寫;讀寫鎖同一時間內只允許乙個寫者,但是允許多個讀者同時讀物件。

所謂死鎖,是指多個程序在執行過程中因爭奪資源而造成的一種僵局,當程序處於這種僵持狀態時,若無外力作用,它們都將無法再向前推進。

1) 互斥條件:乙個資源每次只能被乙個程序使用。

2) 請求與保持條件:乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。

3) 不可剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。

4) 迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。

同步 互斥鎖 讀寫鎖 區別

相交程序之間的關係主要有兩種,同步與互斥。所謂互斥,是指散步在不同程序之間的若干程式片斷,當某個程序執行其中乙個程式片段時,其它程序就不能執行它 們之中的任一程式片段,只能等到該程序執行完這個程式片段後才可以執行。所謂同步,是指散步在不同程序之間的若干程式片斷,它們的執行必須嚴格按照規定的 某種先後...

互斥鎖與讀寫鎖使用

sync.mutex和sync.rwmutex是go語言底層基礎物件,用於構建多個goroutine間的同步邏輯,當多個協程需要對共享資料讀寫時用到。具體實現極為簡潔,效能也 舉例 1.多個協程操作同乙個檔案 2.生產者消費者模型 具體例項我就以最簡單的列印方式說明互斥鎖 func print t ...

互斥鎖和讀寫鎖

互斥鎖的型別 對資源的訪問是互斥的,即執行緒a對資源加鎖後,在a解鎖前,其他執行緒不能訪問這個加鎖的資源。互斥鎖的特點 多個執行緒訪問資源的時候是序列的 互斥鎖的使用步驟 建立乙個互斥鎖 pthread mutex t mutex 初始化這把鎖 pthread mutex init mutex,nu...