Linux 互斥鎖 讀寫鎖 條件變數簡單認識

2021-10-05 19:18:57 字數 1936 閱讀 9961

執行緒同步:協調同步,對公共區域資料按序訪問,防止資料混亂,產生於時間有關的錯誤

鎖的使用:對公共資料進行保護,所有執行緒【應該】在訪問公共資料前先拿到鎖再訪問,但鎖本身不具備強制性

mutex的主要應用函式

pthread_mutex_init初始化

pthread_mutex_destory銷毀

pthread_mutex_lock加鎖

pthread_mutex_trylock嘗試拿鎖

pthread_mutex_unlock解鎖

這幾個函式的返回值都是:成功返回0;失敗返回錯誤號

pthread_mutex_t型別,其本質是乙個結構體,簡單可以當成乙個整數看待,該型別的變數取值只有0/1兩個取值,初始值為1,加鎖為0(–),解鎖為1(++)

try鎖與lock加鎖: lock加鎖失敗會阻塞,等待鎖釋放;tyrlock加鎖失敗直接返回錯誤號,如ebusy,不阻塞+

使用互斥鎖的一般步驟:

立即解鎖

特別強調,讀寫鎖只有一把,但是具備兩種狀態:

1,讀模式下加鎖狀態(讀鎖)

2,寫模式下加鎖狀態(寫鎖)

====》

1)當鎖是寫模式加鎖時, 解鎖前,所有對該鎖加鎖的執行緒都會被阻塞

2)當鎖是讀模式加鎖時,解鎖前,如果執行緒以讀模式對其加鎖會成功;如果執行緒以寫模式加鎖就會被阻塞

3)當鎖是讀模式加鎖時,既有試圖以寫模式加鎖的執行緒,也有試圖以讀模式加鎖的執行緒時,讀寫鎖會阻塞隨後的讀模式鎖請求,優先滿足寫模式鎖。讀鎖,寫鎖並行阻塞,寫鎖優先順序高

讀寫鎖也叫所「共享-獨佔鎖」,當讀寫鎖以讀模式鎖住時,它是以共享模式鎖住的;當它以寫模式鎖住時,它是以獨佔模式鎖住的

讀寫鎖非常適合於對資料結構讀的次數遠大於寫的情況

1)執行緒試圖對同乙個互斥量a加鎖兩次,對乙個鎖進行反覆lock

2)執行緒1擁有a鎖,請求獲得b鎖;執行緒2擁有b鎖,請求獲得a鎖

條件變數本身不是鎖,但它也可以造成執行緒阻塞,通常與互斥鎖配合使用,給多執行緒提供乙個會合的場所

動態初始化和靜態初始化

條件變數相關函式wait

pthread_cond_wait阻塞等待乙個條件變數

int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);

引數1 條件變數;引數2 互斥鎖

函式作用:

1)阻塞等待條件變數,引數1

2)釋放已掌握的互斥鎖(解除互斥鎖)相當於pthread_mutex_unlock(&mutex);

3)當喚醒時,pthread_cond_wait函式返回時,解除阻塞並重新申請獲取互斥鎖pthread_mutex_lock(&mutex);

1) 2)兩部都是原子操作

pthread_cond_signalpthread_cond_broadcast用於通知條件是否滿足,條件滿足後解除阻塞並重寫加鎖

互斥鎖 自旋鎖 讀寫鎖 條件變數

互斥鎖 同一時刻只能有乙個執行緒進入臨界區,乙個執行緒獲取鎖如果失敗,則該執行緒進入睡眠狀態,同一執行緒多次加鎖會造成死鎖。使用場景 1.持鎖時間長 2臨界區競爭非常激烈 3 單核處理器 自旋鎖 不會造成執行緒進入睡眠狀態,執行緒會不斷檢測鎖是否已經釋放,減少了執行緒從睡眠到喚醒的核心開銷。使用場景...

Linux使用互斥鎖和條件變數實現讀寫鎖(寫優先)

1 只要沒有執行緒持有某個給定的讀寫鎖用於寫,那麼任意數目的執行緒可以持有該讀寫鎖用於讀 2 僅當沒有執行緒持有某個讀寫鎖用於讀或用於寫時,才能分配該讀寫鎖用於寫 換一種說法就是,只要沒有執行緒在修改 寫 某個給定的資料,那麼任意數目的執行緒都可以擁有該資料的訪問權 讀 僅當沒有其它執行緒在讀或者修...

互斥鎖 讀寫鎖 自旋鎖 條件變數的特點總結

讀寫鎖特點 1 多個讀者可以同時進行讀 2 寫者必須互斥 只允許乙個寫者寫,也不能讀者寫者同時進行 3 寫者優先於讀者 一旦有寫者,則後續讀者必須等待,喚醒時優先考慮寫者 互斥鎖特點 一次只能乙個執行緒擁有互斥鎖,其他執行緒只有等待 互斥鎖是在搶鎖失敗的情況下主動放棄cpu進入睡眠狀態直到鎖的狀態改...