執行緒同步:協調同步,對公共區域資料按序訪問,防止資料混亂,產生於時間有關的錯誤
鎖的使用:對公共資料進行保護,所有執行緒【應該】在訪問公共資料前先拿到鎖再訪問,但鎖本身不具備強制性
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_signal
和pthread_cond_broadcast
用於通知條件是否滿足,條件滿足後解除阻塞並重寫加鎖
互斥鎖 自旋鎖 讀寫鎖 條件變數
互斥鎖 同一時刻只能有乙個執行緒進入臨界區,乙個執行緒獲取鎖如果失敗,則該執行緒進入睡眠狀態,同一執行緒多次加鎖會造成死鎖。使用場景 1.持鎖時間長 2臨界區競爭非常激烈 3 單核處理器 自旋鎖 不會造成執行緒進入睡眠狀態,執行緒會不斷檢測鎖是否已經釋放,減少了執行緒從睡眠到喚醒的核心開銷。使用場景...
Linux使用互斥鎖和條件變數實現讀寫鎖(寫優先)
1 只要沒有執行緒持有某個給定的讀寫鎖用於寫,那麼任意數目的執行緒可以持有該讀寫鎖用於讀 2 僅當沒有執行緒持有某個讀寫鎖用於讀或用於寫時,才能分配該讀寫鎖用於寫 換一種說法就是,只要沒有執行緒在修改 寫 某個給定的資料,那麼任意數目的執行緒都可以擁有該資料的訪問權 讀 僅當沒有其它執行緒在讀或者修...
互斥鎖 讀寫鎖 自旋鎖 條件變數的特點總結
讀寫鎖特點 1 多個讀者可以同時進行讀 2 寫者必須互斥 只允許乙個寫者寫,也不能讀者寫者同時進行 3 寫者優先於讀者 一旦有寫者,則後續讀者必須等待,喚醒時優先考慮寫者 互斥鎖特點 一次只能乙個執行緒擁有互斥鎖,其他執行緒只有等待 互斥鎖是在搶鎖失敗的情況下主動放棄cpu進入睡眠狀態直到鎖的狀態改...