pthread_mutex_t:互斥鎖變數的型別
例:pthread_mutex_t mutex
int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* attr);
attr:互斥鎖屬性,一般情況下,我們都不需要關心,直接設定為 null
pthread_mutex_t mutex = pthread_mutex_intializer;
pthread_mutex_intializer:巨集定義,裡面對結構體進行可巨集定義,使用這種方式進行初始化的時候,其實是將結構體當中變數的值複製給互斥鎖變數
int pthread_mutex_lock(pthread_mutex_t* mutex);
使用該介面進行加鎖的時候
如果臨界資源可用,意味著互斥鎖變數當中計數器的值為 1,可以進行加鎖,對計數器的值進行減 1操作,加鎖成功,執行流繼續向下執行
如果臨界資源不可用,阻塞等待,執行流不會繼續向下執行
int pthread_mutex_trylock(pthread_mutex_t* mutex);
如果臨界資源可用,意味著互斥鎖變數當中計數器的值為 1,可以進行加鎖,對計數器的值進行減 1操作,加鎖成功,執行流繼續向下執行
如果臨界資源不可用,不會進行阻塞等待,pthread_mutex_trylock 加鎖失敗,返回 busy(拿不到鎖資源)
int pthread_mutex_timedlock(pthread_mutex_t* mutex, const struct timespec* abs_timeout);
mutex:互斥鎖變數
abs_timeout:加鎖的超時時間
當超過加鎖的超時時間之後,還沒有獲取到互斥鎖,就報錯返回,不會再進行阻塞等待,返回 etimeout
struct timespec 當中有兩個引數,第乙個引數是秒,第二個引數為納秒
int pthread_mutex_nulock(pthread_mutex_t* mutex);
三種加鎖方式都可以用這種方式解鎖
int pthread_mutex_destroy(pthread_mutex_t* mutex);
如果不呼叫銷毀介面,會造成記憶體洩漏
搶票程式,需要考慮四個問題:
初始化位置
建立執行緒之前
加鎖位置
訪問資源之前
未解鎖的後果
造成所有想要加該鎖的執行緒都進入阻塞狀態,這也是死鎖之一的情況
解鎖位置
在所有有可能退出的地方都需要進行解鎖
#include
#include
#include
#include
#include
#include
int ticket =
100;
pthread_mutex_t mutex;
void
*route
(void
*arg)
else}}
int main
(void
)
加鎖過程中造成了死鎖問題,死鎖原因、解決方法詳細見部落格. 自旋鎖替代互斥鎖使用場景
自旋鎖和互斥鎖是多執行緒程式中的重要概念。它們被用來鎖住一些共享資源,以防止併發訪問這些共享資料時可能導致的資料不一致問題。但是它們的不同之處在 我們應該在什麼時候用自旋鎖代替互斥鎖?從理論上說,如果乙個執行緒嘗試加鎖乙個互斥鎖的時候沒有成功,因為互斥鎖已經被鎖住了,這個未獲取鎖的執行緒會休眠以使得...
悲觀鎖 樂觀鎖的區別及使用場景
悲觀鎖 pessimistic lock 每次獲取資料的時候,都會擔心資料被修改,所以每次獲取資料的時候都會進行加鎖,確保在自己使用的過程中資料不會被別人修改,使用完成後進行資料解鎖。由於資料進行加鎖,期間對該資料進行讀寫的其他執行緒都會進行等待。樂觀鎖 optimistic lock 每次獲取資料...
髮夾模式的使用及應用場景
因為裝置傳輸不對稱導致交換模式下出現雙收等現象,所以近期研究了一下髮夾模式,由場景說說髮夾模式的使用。起因 工作在二層模式的整套裝置,為了防止雙收使用髮夾模式處理業務。網路拓撲 說明 如圖所設,如果終端b2向終端b1發出一條報文,當不使用髮夾模式時,在終端b1會收到兩份相同的資料。兩份資料 乙份 於...