讀寫鎖pthread rwlock t的使用

2021-06-19 09:07:31 字數 1570 閱讀 1424

讀寫鎖是用來解決讀者寫者問題的,讀操作可以共享,寫操作是排他的,讀可以有多個在讀,寫只有唯一個在寫,同時寫的時候不允許讀。

具有強讀者同步和強寫者同步兩種形式

強讀者同步:當寫者沒有進行寫操作,讀者就可以訪問;

強寫者同步:當所有寫者都寫完之後,才能進行讀操作,讀者需要最新的資訊,一些事實性較高的系統可能會用到該所,比如定票之類的。

讀寫鎖的操作:

讀寫鎖的初始化:

定義讀寫鎖:          pthread_rwlock_t  m_rw_lock;

函式原型:              pthread_rwlock_init(pthread_rwlock_t * ,pthread_rwattr_t *);

返回值:0,表示成功,非0為一錯誤碼

讀寫鎖的銷毀:

函式原型:             pthread_rwlock_destroy(pthread_rwlock_t* );

返回值:0,表示成功,非0表示錯誤碼

獲取讀寫鎖的讀鎖操作:分為阻塞式獲取和非阻塞式獲取,如果讀寫鎖由乙個寫者持有,則讀執行緒會阻塞直至寫入者釋放讀寫鎖。

阻塞式:

函式原型:pthread_rwlock_rdlock(pthread_rwlock_t*);

非阻塞式:

函式原型:pthread_rwlock_tryrdlock(pthread_rwlock_t*);

返回值: 0,表示成功,非0表示錯誤碼,非阻塞會返回ebusy而不會讓執行緒等待

獲取讀寫鎖的寫鎖操作:分為阻塞和非阻塞,如果對應的讀寫鎖被其它寫者持有,或者讀寫鎖被讀者持有,該執行緒都會阻塞等待。

阻塞式:

函式原型:pthread_rwlock_wrlock(pthread_rwlock_t*);

非阻塞式:

函式原型:pthread_rwlock_trywrlock(pthread_rwlock_t*);

返回值: 0,表示成功

釋放讀寫鎖:

函式原型:pthread_rwlock_unlock(pthread_rwlock_t*);

總結**):

互斥鎖與讀寫鎖的區別:

當訪問臨界區資源時(訪問的含義包括所有的操作:讀和寫),需要上互斥鎖;

當對資料(互斥鎖中的臨界區資源)進行讀取時,需要上讀取鎖,當對資料進行寫入時,需要上寫入鎖。

讀寫鎖的優點:

對於讀資料比修改資料頻繁的應用,用讀寫鎖代替互斥鎖可以提高效率。因為使用互斥鎖時,即使是讀出資料(相當於操作臨界區資源)都要上互斥鎖,而採用讀寫鎖,則可以在任一時刻允許多個讀出者存在,提高了更高的併發度,同時在某個寫入者修改資料期間保護該資料,以免任何其它讀出者或寫入者的干擾。

讀寫鎖描述:

獲取乙個讀寫鎖用於讀稱為共享鎖,獲取乙個讀寫鎖用於寫稱為獨佔鎖,因此這種對於某個給定資源的共享訪問也稱為共享-獨佔上鎖。

有關這種型別問題(多個讀出者和乙個寫入者)的其它說法有讀出者與寫入者問題以及多讀出者-單寫入者鎖。

讀寫鎖與自旋鎖

一 讀寫鎖 1 特點 讀寫鎖比mutex有更高的適用性,可以多個執行緒同時占用讀模式的讀寫鎖,但是只能乙個執行緒占用寫模式的讀寫鎖。1 當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞 2 當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問權...

互斥鎖和讀寫鎖

互斥鎖的型別 對資源的訪問是互斥的,即執行緒a對資源加鎖後,在a解鎖前,其他執行緒不能訪問這個加鎖的資源。互斥鎖的特點 多個執行緒訪問資源的時候是序列的 互斥鎖的使用步驟 建立乙個互斥鎖 pthread mutex t mutex 初始化這把鎖 pthread mutex init mutex,nu...

讀寫鎖 可重入鎖

讀寫鎖就是分了兩種情況,一種是讀時的鎖,一種是寫時的鎖,它允許多個執行緒同時讀共享變數,但是只允許乙個執行緒寫共享變數,當寫共享變數的時候也會阻塞讀的操作。這樣在讀的時候就不會互斥,提高讀的效率。可以用來讀寫快取,步驟 1 加讀鎖,從快取讀取key對應的value 2 若讀取到,則返回,並釋放讀鎖 ...