解說執行緒安全之讀寫鎖

2021-07-17 04:56:42 字數 2157 閱讀 3863

宣告:以下內容來自維基百科,但是融入個人思想,使其更加形象易懂:

讀寫鎖

讀寫鎖實際是一種特殊的自旋鎖,它把對共享資源的訪問者劃分成讀者和寫者讀者只對共享資源進行讀訪問,寫者則需要對共享資源進行寫操作。

這種鎖相對於自旋鎖而言,能提高併發性,因為在

多處理器系統

中,它允許同時有多個讀者來訪問共享資源,最大可能的讀者數為實際的邏輯cpu數。寫者是排他性的,乙個讀寫鎖同時只能有乙個寫者或多個讀者(與cpu數相關),

但不能同時既有讀者又有寫者。

在讀寫鎖保持期間也是搶占失效的。

如果讀寫鎖當前沒有讀者,也沒有寫者,那麼寫者可以立刻獲得讀寫鎖,否則它必須自旋在那裡,直到沒有任何寫者或讀者。

如果讀寫鎖沒有寫者,那麼讀者可以立即獲得該讀寫鎖,否則讀者必須自旋在那裡,直到寫者釋放該讀寫鎖。

1. 特性:

一次只有乙個執行緒可以占有寫模式的讀寫鎖, 但是可以有多個執行緒同時占有讀模式的讀寫鎖.

正是因為這個特性:

1.當讀寫鎖是寫加鎖狀態時, 在這個鎖被解鎖之前, 所有試圖對這個鎖加鎖的執行緒都會被阻塞

2.當讀寫鎖在讀加鎖狀態時, 所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問權,但是如果執行緒希望以寫模式對此鎖進行加鎖, 它必須直到所有的執行緒釋放鎖.

通常, 當讀寫鎖處於讀模式鎖住狀態時, 如果有另外執行緒試圖以寫模式加鎖, 讀寫鎖通常會阻塞隨後的讀模式鎖請求, 這樣可以避免讀模式鎖長期占用, 而等待的寫模式鎖請求長期阻塞.

2. 適用性:

讀寫鎖適合於對

資料結構

的讀次數比寫次數多得多的情況. 因為, 讀模式鎖定時可以共享, 以寫模式鎖住時意味著獨佔, 所以讀寫鎖又叫共享-獨佔鎖.

3. 初始化和銷毀

#include int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

成功則返回0, 出錯則返回錯誤編號. 同

互斥量 以上, 在釋放讀寫鎖占用的記憶體之前, 需要先通過pthread_rwlock_destroy對讀寫鎖進行清理工作, 釋放由init分配的資源.

4. 讀和寫:

#include 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個函式分別實現獲取讀鎖, 獲取寫鎖和釋放鎖的操作. 獲取鎖的兩個函式是阻塞操作, 同樣, 非阻塞的函式為:

#include int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

成功則返回0, 出錯則返回錯誤編號.

非阻塞的獲取鎖操作, 如果可以獲取則返回0, 否則返回錯誤的ebusy.

賜教!

讀寫鎖實現執行緒安全快取

讀寫鎖 可以多執行緒讀,但只有乙個執行緒寫入 並且寫入的時候不能讀取,讀取的時候不能寫入。具體 如下 測試 public class testreadandwritelock for int i 0 i 100 i console.readline public void taskadd int i...

讀寫鎖以及執行緒安全的集合

讀寫鎖實現 讀寫鎖實現執行緒安全的list 讀寫鎖實現 class mylist extends arraylist finally override public object get int index finally override public boolean add object e f...

linux執行緒同步之讀寫鎖

讀寫鎖與互斥量類似,不過讀寫鎖的並行性更高。讀寫鎖可以有三種狀態 1 讀模式加鎖 2 寫模式加鎖 3 不加鎖。在寫加鎖狀態時,在解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞。在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問許可權。但是如果執行緒希望以寫模式加鎖,它必須阻塞,直至...