讀寫鎖與自旋鎖

2021-08-09 03:38:59 字數 1541 閱讀 2123

一、讀寫鎖

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中常見的鎖主要有互斥鎖...

互斥鎖 自旋鎖 讀寫鎖 悲觀鎖 樂觀鎖

最底層的兩種就是會 互斥鎖和自旋鎖 有很多高階的鎖都是基於它們實現的,你可以認為它們是各種鎖的地基,所以我們必須清楚它倆之間的區別和應用。加鎖的目的就是保證共享資源在任意時間裡,只有乙個執行緒訪問,這樣就可以避免多執行緒導致共享資料錯亂的問題。當已經有乙個執行緒加鎖後,其他執行緒加鎖則就會失敗,互斥...