一、讀寫鎖
1、特點
讀寫鎖比mutex有更高的適用性,可以多個執行緒同時占用讀模式的讀寫鎖,但是只能乙個執行緒占用寫模式的讀寫鎖。
(1)當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞;
(2)當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問權,但是以寫模式對它進行枷鎖的執行緒將阻塞;
(3)當讀寫鎖在讀模式鎖狀態時,如果有另外執行緒試圖以寫模式加鎖,讀寫鎖通常會阻塞隨後的讀模式鎖請求,這樣可以避免讀模式鎖長期占用,而等待的寫模式鎖請求長期阻塞;
2、適用性
讀寫鎖適合於對資料結構的讀次數比寫次數多得多的情況。 因為, 讀模式鎖定時可以共享, 以寫模式鎖住時意味著獨佔, 所以讀寫鎖又叫共享-獨佔鎖。
3、相關函式
#include < pthread.h >
初始化和銷毀
int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);
int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);
返回值:成功返回0,失敗返回錯誤編號。
屬性設定
int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * restrict attr, int *restrict pshared);
設定讀寫鎖屬性物件,標識在程序間共享與否
int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr, int pshared);
可用來設定由程序共享的讀寫鎖屬性。
返回值:成功返回0,失敗返回錯誤編號。
讀和寫
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
返回值:成功則返回0, 出錯則返回錯誤編號。
這3個函式分別實現獲取讀鎖, 獲取寫鎖和釋放鎖的操作, 獲取鎖的兩個函式是阻塞操作。
二、自旋鎖
自旋鎖與互斥鎖比較類似,它們都是為了解決對某項資源的互斥使用。無論是互斥鎖,還是自旋鎖,在任何時刻最多只能有乙個執行單元獲得鎖。但是兩者在排程機制上略有不同。對於互斥鎖,如果資源已經被占用,資源申請者只能進入睡眠狀態。但是自旋鎖不會引起呼叫者睡眠,如果自旋鎖已經被別的執行單元保持,呼叫者就一直迴圈在那裡看是否該自旋鎖的保持者已經釋放了鎖。
讀寫自旋鎖
讀 寫自旋鎖同樣是在保護smp體系下的共享資料結構而引入的,它的引入是為了增加核心的併發能力。只要核心控制路徑沒有對資料結構進行修改,讀 寫自旋鎖就允許多個核心控制路徑同時讀同一資料結構。如果乙個核心控制路徑想對這個結構進行寫操作,那麼它必須首先獲取讀 寫鎖的寫鎖,寫鎖授權獨佔訪問這個資源。這樣設計...
Linux 互斥鎖 遞迴鎖 自旋鎖 讀寫鎖
在多執行緒中,我們經常會要用到鎖,那麼,鎖是什麼,我們為什麼要用到鎖?回到問題的本質,我們在什麼場景下會用到鎖?鎖是針對程式中的臨界資源,也就是公共資源的,當我們有兩個或多個執行緒同時對乙個臨界資源操作的時候,為了保證共享資料操作的完整性,我們要為這些公共資源加鎖。在linux中常見的鎖主要有互斥鎖...
互斥鎖 自旋鎖 讀寫鎖 悲觀鎖 樂觀鎖
最底層的兩種就是會 互斥鎖和自旋鎖 有很多高階的鎖都是基於它們實現的,你可以認為它們是各種鎖的地基,所以我們必須清楚它倆之間的區別和應用。加鎖的目的就是保證共享資源在任意時間裡,只有乙個執行緒訪問,這樣就可以避免多執行緒導致共享資料錯亂的問題。當已經有乙個執行緒加鎖後,其他執行緒加鎖則就會失敗,互斥...