互斥鎖的建立
1.pthread_mutex_t mutex=pthread_mutex_initializer;互斥鎖在乙個執行緒中的使用2.pthread_mutex_t mutex;
pthread_mutex_init(&mutex);
以上兩種方式都行
pthread_mutex_
t mutex=pthread_mutex_
initializer;//建立互斥鎖並初始化
pthread_mutex_
lock(&mutex);//對執行緒上鎖,此時其他執行緒阻塞等待該執行緒釋放鎖
----
要執行的**段
----
pthread_mutex_
unlock(&mutex);//執行完後釋放鎖
那麼為什麼要將要執行的的**加鎖後再執行呢
先了解一下原子操作的概念
假如現在有兩個執行緒都在修改乙個全域性變數
int
number = 10
;void
p(void
)void
q(void
)int
main(void
)
執行上面這段程式,最後number的值是多少?你可能會說如果先加,那麼最終結果就是22,否則就是21。真的是這樣嗎?其實並不是的
上圖為執行+=操作的步驟,方框為暫存器,在加一時,先從變數空間拿出變數值,然後在暫存器中加一,最後將加一的值放回變數空間將原值覆蓋,從而完成一次加操作。
上圖表示了兩個執行緒對全域性變數操作的一種情況,執行緒1和2都拿到number的初始值,執行緒1操作後將11放回變數空間,但是執行緒2不久後將20也放回變數空間將11覆蓋。
所以互斥鎖就是為了避免這種情況,在乙個執行緒修改變數時加鎖,則其他變數阻塞,等待加鎖的變數解鎖後再執行,這樣避免了如圖的情況和其他的異常情況。
以上就是我對學到的互斥鎖作用的理解,如有錯誤歡迎指正
golang之讀寫鎖,互斥鎖的理解
golang sync包裡提供了 locker介面 互斥鎖 mutex 讀寫鎖 rwmutex用於處理併發過程中可能出現同時兩個或多個協程 或執行緒 讀或寫同乙個變數的情況。在併發的情況下,多個執行緒或協程同時去修改乙個變數。使用鎖能保證在某一時間點內,只有乙個協程或執行緒修改這一變數,具體我們可以...
互斥鎖機制,互斥鎖與讀寫鎖區別
互斥鎖 mutex,用於保證在任何時刻,都只能有乙個執行緒訪問該物件。當獲取鎖操作失敗時,執行緒會進入睡眠,等待鎖釋放時被喚醒 讀寫鎖 rwlock,分為讀鎖和寫鎖。處於讀操作時,可以允許多個執行緒同時獲得讀操作。但是同一時刻只能有乙個執行緒可以獲得寫鎖。其它獲取寫鎖失敗的執行緒都會進入睡眠狀態,直...
鎖 互斥鎖,死鎖
當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制 執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入乙個狀態 鎖定 非鎖定 某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執行緒不能更改 直到該執行緒釋放資源,將資源的狀態變...