讀寫鎖

來源:互聯網
上載者:User

標籤:讀寫鎖

一.概述:

  有一種情況:即對一些公用資源的訪問操作很多,但修改操作比較少,而訪問操作往往伴隨著尋找操作,中間耗時很長。此時如果用互斥鎖的話,一個線程會在讀操作內待的時間比較長,如果是多線程就會降低並發性。而如果用讀寫鎖,其並發性會大大提高(理論上,有多少個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

讀寫鎖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.