線程間同步與互斥——讀寫鎖

       在編寫多線程時,有些公共數據修改的機會比較少,相對比較寫它們讀的機會返回很多,在讀的過程中往往伴隨查找的操作,中間耗時很長,給這種代碼加鎖反而會降低我們的效率,有一種方法專門處理這種問題,那就是——讀寫鎖

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

       自旋鎖是專門爲防止多處理器併發而引入的一種鎖。自旋鎖的初衷就是:在短時間內進行輕量級的鎖定。一個被爭用的自旋鎖使得請求它的線程在等待重新可用的期間內進行自旋,所以自旋鎖不應該被持有時間太長。二元信號量和互斥鎖都稱之爲掛起等待鎖。

我們來了解一下讀寫鎖中的各個接口函數:

pthread_rwlock_destroy用來銷燬一個讀寫鎖,參數爲自己定義的一個共享的變量的地址。

pthread_rwlock_init用來初始化一個讀寫鎖,第一個參數同上,第二個參數設置爲NULL,指缺省屬性。


pthread_rwlock_rdlock是請求寫的鎖,參數爲讀寫鎖變量的地址。

pthread_rwlock_tryrdlock成功時返回0,失敗時返回的是錯誤碼。


pthread_rwlock_wrlock是請求讀的鎖,參數還是爲讀寫鎖變量的地址。

pthread_rwlock_trywrlock成功時返回的是0,失敗時返回的是錯誤碼。


不管是讀鎖還是寫鎖,釋放鎖都用的是pthread_rwlock_unlock函數。

       下面用讀寫鎖實現的讀者寫者問題中,寫者每次對data進行加1操作,讀者只需要讀出data即可。讀者與寫者問題中,寫者與寫者之間是互斥關係,讀者與讀者之間沒有關係,在同步與互斥的實現中,還有讀者優先還是寫者優先的問題。即當有讀者正在讀數據時,同時來了讀者和寫者,讀者優先是指來的讀者優先讀,寫者優先是指來的寫者在當前讀者讀完時進去臨界區進行寫操作。


下面是三種結果,第一種是讀者和寫者之間沒有任何一方sleep時的結果,當寫者寫完時讀者進行讀操作。

第二種是,當寫者寫的慢時,它能獲得鎖的機會就大大減少了,可見讀者讀的機會就多了。

第三種是,當讀者讀的慢時,它獲得鎖的機會大大減少了,而寫者就會獲得更多寫的機會。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章