01. 讀寫鎖概述
當有一個線程已經持有互斥鎖時,互斥鎖將所有試圖進入臨界區的線程都阻塞住。但是考慮一種情形,當前持有互斥鎖的線程只是要讀訪問共享資源,而同時有其它幾個線程也想讀取這個共享資源,但是由於互斥鎖的排它性,所有其它線程都無法獲取鎖,也就無法讀訪問共享資源了,但是實際上多個線程同時讀訪問共享資源並不會導致問題。
在對數據的讀寫操作中,更多的是讀操作,寫操作較少,例如對數據庫數據的讀寫應用。爲了滿足當前能夠允許多個讀出,但只允許一個寫入的需求,線程提供了讀寫鎖來實現。
讀寫鎖的特點如下:
1)如果有其它線程讀數據,則允許其它線程執行讀操作,但不允許寫操作。
2)如果有其它線程寫數據,則其它線程都不允許讀、寫操作。
讀寫鎖分爲讀鎖和寫鎖,規則如下:
1)如果某線程申請了讀鎖,其它線程可以再申請讀鎖,但不能申請寫鎖。
2)如果某線程申請了寫鎖,其它線程不能申請讀鎖,也不能申請寫鎖。
POSIX 定義的讀寫鎖的數據類型是: pthread_rwlock_t。
02. 讀寫鎖函數
2.1 讀寫鎖初始化
2.2 讀寫鎖銷燬
2.3 申請讀鎖
2.4 申請寫鎖
2.5 釋放讀寫鎖
03. 讀寫鎖應用示例
下面是一個使用讀寫鎖來實現 4 個線程讀寫一段數據是實例。在此示例程序中,共創建了 4 個線程,其中兩個線程用來寫入數據,兩個線程用來讀取數據。當某個線程讀操作時,其他線程允許讀操作,卻不允許寫操作;當某個線程寫操作時,其它線程都不允許讀或寫操作。
測試結果: