互斥鎖(使用過程及應用場景)

2021-10-03 04:26:53 字數 1796 閱讀 8609

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會收到兩份相同的資料。兩份資料 乙份 於...