讀寫鎖的實現原理(pthread_rwlock_t)


引言

不同的鎖之間的語義是不一樣的,沒有一勞永逸的鎖,只有更適合的鎖。

如果是同一進程里的不同線程共享讀寫鎖,那么讀寫鎖變量的維護是在進程內部即可。如果是不同進程共享讀寫鎖,那么讀寫鎖變量的維護是在共享存儲區。

讀寫鎖的分配規則:

(1)只要沒有線程占用寫鎖,那么任意數目的線程都可以持有這個讀鎖。

(2)只要沒有線程占用讀寫鎖,那么才能為一個線程分配寫鎖。

讀鎖相當於一個共享鎖,寫鎖i相當於獨占鎖。

和當初上操作系統講的讀者寫者問題一樣,只是當初好不理解啊。

讀寫鎖實現原理

 一種實現機制——互斥鎖和條件變量。讀者有興趣可以自己實現一種。這種實現是一種寫優先。

1、pthread_rwlock_t數據結構

typedef struct{
    pthread_mutex_t rw_mutex;// basic lock on this  struct
    pthread_cond_t  rw_condreaders;//for reader
    pthread_cond_t rw_condwriteres;//for writer
    
    int rw_magic;                  //for error checking
    int rw_nwaiterreaders;         //the num of readers
    int rw_nwaiterwirteres;        //the num of writers
    int rw_refcount;               //-1 is writer has this lock else reader has this lock
}pthread_rwlock_t;

 rw_magic這個成員,如果沒有設置屬性的時候,創建鎖的時候就會給予一個默認值(用於檢查傳遞的鎖是否是一個已經完成初始化的鎖)。摧毀鎖的時候,設置為0.

rw_refcount這個成員,它是用來指示本讀寫鎖的當前狀態,-1表示寫鎖,0表示可用,>0則意味着有多個讀進程占用該鎖。

申請一個讀鎖時,

鎖的釋放,假定優先喚醒寫操作:

 

2、同一進程里面的不同線程,是可以相互取消的。相互取消這種情況還是會發生的,比如一個線程發現了一些錯誤,這些錯誤是致命的,所以要通知其他線程,你們別干了,再干下去還是會遇到錯誤,所以就把他們取消了。拿本設計結構來說,如果被取消的線程是獲取了互斥鎖,並且阻塞在pthread_cond_wait調用中,這個時候應該怎們辦呢?因為,線程被動終止(可能沒有解互斥鎖的調用),而不是主動中止(有解互斥鎖的調用),用到清理程序。清理程序會在線程終止時被調用,無需主動顯式調用。

pthread_cleanup_push(void (*func(void *)),void *arg);

pthread_cleanup_pop(int excute);顯式取消所注冊的清理程序


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM