執行緒間的同步與互斥

2021-09-26 06:12:25 字數 1261 閱讀 3393

臨界資源:多執行緒共享的資源流就是臨界資源

臨界區:每個執行緒內部,訪問臨界資源的**,就叫做臨界區

互斥:任何時刻,互斥保證有且只有乙個執行流進入臨界區,訪問臨界資源,通常對臨界資源起保護作用

原子性:不會被任何排程機制打斷的操作,該操作只有兩態,要麼完成,要麼未完成

多執行緒併發的操作共享變數,會帶來一些問題

pthread_mutex_create mutex;建立乙個名為mutex的互斥鎖

pthread_mutex_init(&mutex, null);對mutex這個互斥鎖進行初始化

pthread_mutex_lock(&mutex)/ pthread_mutex_unlock(&mutex) 對mutex這把鎖進行加鎖和解鎖操作

pthread_mutex_destroy(&mutex) 銷毀這把鎖

注意,建立鎖時有兩種方法,一種是動態分配

其格式為 pthread_mutex_create mutex = pthread_,mutex_create

這種靜態分配的鎖不需要銷毀

而且這種鎖,即時建立多個,他們的位址雖然會相同,但是仍然不是同一把鎖

平時我們使用的pthread_mutex_create mutex;屬於動態分配,這種鎖在使用完之後需要進行銷毀

當乙個執行緒互斥地訪問某個變數時,它可能發現在其他執行緒改變狀態之前,他什麼也做不了

例如乙個執行緒訪問佇列時,發現隊列為空,它只能等待,知道另乙個執行緒將節點加入到佇列中,這種情況就需要用到條件變數

同步:在保證資料安全的前提下,讓執行緒能夠按照某種特定的順序訪問臨界資源,從而有效避免飢餓問題,叫做同步

競態條件:因為時序問題,而導致程式異常,我們稱之為競態條件

pthread_cond_create cond;建立乙個名為cond的條件變數

pthread_cond_init(&cond, null);對mutex這個條件變數進行初始化

pthread_cond_wait(&cond,&mutex)/ pthread_cond_signal(&cond) 對cond這個條件變數進行等待和喚醒操作

pthread_cond_destroy(&cond) 銷毀這個條件變數

條件等待是執行緒間同步的一種手段,如果只有乙個執行緒,條件不滿足,一直等下去都不會滿足,所以必須有乙個執行緒通過某些操作,改變共享變數,使原先不滿足的條件變得滿足,並且友好的通知等待在條件變數上的執行緒

條件不會無緣無故的突然變滿足了,必然會牽扯到共享資料的變化。所以一定要用互斥鎖來保護。沒有互斥鎖就無法安全的獲取和修改共享資料

多執行緒間的同步與互斥

多執行緒與臨界區 多執行緒想要訪問臨界區時,就要對臨界區進行上鎖,這與之前寫到的程序互斥是乙個道理,這也就是防止共享資料被併發訪問的解決方法,這種上鎖叫做互斥鎖 互斥鎖互斥鎖以排他的方式保護共享資料被併發訪問。互斥鎖是乙個二元訊號量 互斥鎖的基本操作 條件變數 條件變數基本原理 互斥鎖能夠解決資源的...

Linux 執行緒間的同步與互斥

執行緒同步 條件變數 為什麼使用條件變數?對臨界資源的時序可控性,條件滿足會通知其他等待操作臨界資源的執行緒,類似訊號。場景 t day展會排隊參觀 生產者消費者模型 條件變數是什麼?是一種同步機制,乙個執行緒用於修改這個變數使其滿足其它執行緒繼續往下執行的條件,其它執行緒則接收條件已經發生改變的訊...

執行緒同步與互斥

與多程序互動一樣,各個不同的執行緒之間也會存在資源的共享問題。為了解決多執行緒之間對資源訪問的同步和互斥問題,我們需要了解執行緒同步機制。第一種機制 互斥鎖 互斥鎖是一種簡單的加鎖方法,可以使單個執行緒進行對資源訪問的原子操作。互斥鎖的基本操作就是加鎖和解鎖。互斥鎖主要包含以下函式 1 初始化函式 ...