引言
不同的鎖之間的語義是不一樣的,沒有一勞永逸的鎖,只有更適合的鎖。
如果是同一進程里的不同線程共享讀寫鎖,那么讀寫鎖變量的維護是在進程內部即可。如果是不同進程共享讀寫鎖,那么讀寫鎖變量的維護是在共享存儲區。
讀寫鎖的分配規則:
(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);顯式取消所注冊的清理程序