標籤:讀寫鎖
一.概述:
有一種情況:即對一些公用資源的訪問操作很多,但修改操作比較少,而訪問操作往往伴隨著尋找操作,中間耗時很長。此時如果用互斥鎖的話,一個線程會在讀操作內待的時間比較長,如果是多線程就會降低並發性。而如果用讀寫鎖,其並發性會大大提高(理論上,有多少個cpu就會有多少個線程同時進行讀操作),從而提高程式的效率。
讀寫鎖必須維持三種關係:讀者之間不能互斥(即沒有關係),寫者之間要互斥,讀者與寫者之間要互斥和同步。
讀寫鎖是一種特殊的自旋鎖。自旋鎖:當條件不成立的時候會一直詢問(輪詢)直到條件滿足。(適合於在鎖內待的時間較少(可以減少線程調度))。
讀寫鎖的三種狀態:
1.當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的線程都會被阻塞
2.當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的線程都可以得到訪問權,但是以寫入模式 對它進行加鎖的線程將會被阻塞
3.當讀寫鎖在讀模式的鎖狀態時,如果有另外的線程試圖以寫入模式加鎖,讀寫鎖通常會阻塞隨後的讀模式鎖的請求,這樣可以避免讀模式鎖長期佔用,而等待的寫入模式鎖請求則長期阻塞。
二.相關函數:
(1).pthread_rwlock_init:int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
const pthread_rwlockattr_t *restrict attr)
rwlock參數:輸出型參數。
attr參數:設定讀寫鎖的狀態,一般為NULL。
傳回值:成功返回0,失敗返回錯誤碼。
(2).pthread_rwlock_destroy:int pthread_rwlock_destroy(pthread_rwlock_t *rwlock)
函數功能:銷毀一共讀寫鎖,並釋放其資源。
傳回值:成功返回0,失敗返回錯誤碼。
(3).pthread_rwlock_rdlock函數:int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)
函數功能:以讀加鎖狀態進行加鎖。(阻塞式的)
傳回值:成功返回0,失敗返回錯誤碼。
(4).thread_rwlock_tryrdlock函數:int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock)
函數功能:以讀加鎖狀態進行加鎖。(非阻塞式的)
傳回值:成功返回0,失敗返回錯誤碼。
(5).thread_rwlock_wrlock函數:int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock)
函數功能:以寫加鎖狀態進行加鎖。(阻塞式的)
傳回值:成功返回0,失敗返回錯誤碼。
(6).thread_rwlock_trywrlock函數:int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock)
函數功能:以寫加鎖狀態進行加鎖。(非阻塞式的)
傳回值:成功返回0,失敗返回錯誤碼。
(7).thread_rwlock_unlock函數:int pthread_rwlock_unlock(pthread_rwlock_t *rwlock)
函數功能:對rwlock進行解鎖。
傳回值:成功返回0,失敗返回錯誤碼。
三.相關代碼:
1 #include<stdio.h> 2 #include<pthread.h> 3 4 int g_data = 0; 5 pthread_rwlock_t rw_lock; 6 7 void* writer(void* arg) 8 { 9 while(1) 10 { 11 pthread_rwlock_wrlock(&rw_lock); 12 g_data++; 13 pthread_rwlock_unlock(&rw_lock); 14 sleep(3); //注意要加在鎖的外面,過5秒獲得寫鎖,其它時間都是讀者 15 } 16 } 17 18 void* reader(void* arg) 19 { 20 21 while(1) 22 { 23 pthread_rwlock_rdlock(&rw_lock); 24 printf("the g_data is: %d\n ",g_data); 25 pthread_rwlock_unlock(&rw_lock); 26 sleep(1); 27 } 28 } 29 30 31 int main() 32 { 33 pthread_rwlock_init(&rw_lock, NULL); 34 pthread_t tid1, tid2; 35 pthread_create(&tid1, NULL, writer, NULL); 36 pthread_create(&tid2, NULL, reader, NULL); 37 pthread_join(tid1, NULL); 38 pthread_join(tid2, NULL); 39 return 0; 40 }
執行結果:
650) this.width=650;" src="http://s4.51cto.com/wyfs02/M00/7F/77/wKiom1cfQJzD4M0xAAA4o7dBkXo758.png" title="2016-04-26 18:18:51螢幕.png" alt="wKiom1cfQJzD4M0xAAA4o7dBkXo758.png" />
總結:讀寫鎖適用於對一共公用資源的讀操作進行多,而寫操作進行少的情況。在這種情況下可以提高讀操作的並發性,因為讀寫鎖中的對讀操作的線程並沒有互斥,理論上有多少個cpu就會有多少個線程在並發進行讀操作。
本文出自 “水仙花” 部落格,請務必保留此出處http://10704527.blog.51cto.com/10694527/1767995
讀寫鎖