讀寫鎖是用來解決讀者寫者問題的,讀操作可以共享,寫操作是排它的,讀可以有多個在讀,寫只有唯一個在寫,寫的時候不允許讀。
具有強讀者同步和強寫者同步兩種形式:
強讀者同步:當寫者沒有進行寫操作時,讀者就可以訪問;
強寫者同步: 當所有寫者都寫完之后,才能進行讀操作,讀者需要最新的信息,一些實時性較高的系統會用到這種鎖。
讀寫鎖的初始化:
pthread_rwlock_t m_rw_lock;
pthread_rwlock_init(pthread_rwlock_t*, pthread_rwattr_t*);
獲取讀寫鎖的讀鎖操作:分為阻塞式獲取和非阻塞式獲取,如果讀寫鎖由一個寫者持有,則讀線程會阻塞直到寫入者釋放讀寫鎖。
阻塞式: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*);
釋放讀寫鎖:
pthread_rwlock_unlock(pthread_rwlock_t*);
互斥鎖與讀寫鎖的區別:
1、當訪問臨界區的資源時(訪問的含義包括所有的操作),需要上互斥鎖;
2、當對數據(互斥鎖中的臨界區資源)進行讀取時,需要上讀取鎖,當對數據進行寫入時,需要上寫入鎖。
讀寫鎖的優點:
對於讀數據較修改數據頻繁的應用,用讀寫鎖代替互斥鎖可以提高效率。因為使用互斥鎖時,即使是讀出數據(相當於操作臨界區資源)都需要上互斥鎖;而采用讀寫鎖則允許在任一時刻多個讀出
者存在,提高了並發性。