讀寫鎖是用來解決讀者寫者問題的,讀操作可以共享,寫操作是排他的,讀可以有多個在讀,寫只有唯一個在寫,同時寫的時候不允許讀。
具有強讀者同步和強寫者同步兩種形式
強讀者同步:當寫者沒有進行寫操作,讀者就可以訪問;
強寫者同步:當所有寫者都寫完之後,才能進行讀操作,讀者需要最新的資訊,一些事實性較高的系統可能會用到該所,比如定票之類的。
讀寫鎖的操作:
讀寫鎖的初始化:
定義讀寫鎖: 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*);
互斥鎖與讀寫鎖的區別:
當訪問臨界區資源時(訪問的含義包括所有的操作:讀和寫),需要上互斥鎖;
當對資料(互斥鎖中的臨界區資源)進行讀取時,需要上讀取鎖,當對資料進行寫入時,需要上寫入鎖。
讀寫鎖的優點:
對於讀資料比修改資料頻繁的應用,用讀寫鎖代替互斥鎖可以提高效率。因為使用互斥鎖時,即使是讀出資料(相當於操作臨界區資源)都要上互斥鎖,而採用讀寫鎖,則可以在任一時刻允許多個讀出者存在,提高了更高的併發度,同時在某個寫入者修改資料期間保護該資料,以免任何其它讀出者或寫入者的干擾。
讀寫鎖描述:
獲取乙個讀寫鎖用於讀稱為共享鎖,獲取乙個讀寫鎖用於寫稱為獨佔鎖,因此這種對於某個給定資源的共享訪問也稱為共享-獨佔上鎖。
有關這種型別問題(多個讀出者和乙個寫入者)的其它說法有讀出者與寫入者問題以及多讀出者-單寫入者鎖。
總結**):
JUC之讀寫鎖
是什麼?讀寫分離的鎖。locks包下的 lock condition readwritelock 裡面的readwritelock 讀寫鎖 維護了一對讀寫操作。讀的鎖可以共享 又叫共享鎖 寫的鎖獨佔 又叫獨佔鎖 即寫操作只能開始寫 寫結束,中間不能插入任何寫的操作。怎麼用?如果沒有鎖的情況 publ...
Unix IPC之讀寫鎖
讀寫鎖比mutex有更高的適用性,可以多個執行緒同時占用讀模式的讀寫鎖,但是只能乙個執行緒占用寫模式的讀寫鎖 1,當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞.2,當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問權,但是以寫模式對它進行...
LINUX鎖之讀寫鎖(C )
讀寫訊號量 rw semaphore 又叫讀寫鎖。允許多個讀者同時持有該訊號量 當有乙個寫者持有該訊號量時,其他讀者跟寫者不可持有該訊號量 當寫者寫完後,可以降級為讀者。讀寫訊號量使用於讀多寫少的情況下使用。declare rwsem name 宣告乙個讀寫訊號量,並對其初始化 struct rw ...