LINUX鎖之讀寫鎖(C )

2021-09-26 06:37:11 字數 1525 閱讀 1971

讀寫訊號量(rw_semaphore)又叫讀寫鎖。

允許多個讀者同時持有該訊號量;當有乙個寫者持有該訊號量時,其他讀者跟寫者不可持有該訊號量;當寫者寫完後,可以降級為讀者。讀寫訊號量使用於讀多寫少的情況下使用。

declare_rwsem(name);

//宣告乙個讀寫訊號量,並對其初始化

struct rw_semaphore *sem;

init_rwsem(sem);

//void init_rwsem(struct rw_semaphore *sem);

//對讀寫訊號量進行初始化

down_read(sem);

//void down_read(struct rw_semaphore *sem);

//獲取讀資格,如果獲取資格失敗,則該執行緒會被掛起

down_read_trylock(sem);

//int down_read_trylock(struct rw_semaphore *sem);

//盡力獲取讀資格,如果獲取失敗,不會被掛起;成功返1,失敗返0

down_write(sem);

//void down_write(struct semaphore *sem);

//獲取寫資格,如果獲取失敗也會被掛起

down_write_trylock(sem);

//int down_write_trylock(struct semaphore *sem);

//up_read(sem);

//void up_read(struct semaphore *sem);

//釋放訊號量

up_write(sem);

//void up_write(struct rw_semaphore *sem);

//downgrade_write(sem);

//void downgrade_write(struct rw_semaphore *sem);

//把寫者降級為讀者

讀寫訊號量適於在讀多寫少的情況下使用,在linux核心中對程序的記憶體映像描述結構的訪問就使用了讀寫訊號量進行保護。在linux中,每乙個程序都用乙個型別為task_t或struct task_struct的結構來描述,該結構的型別為struct mm_struct的字段mm描述了程序的記憶體映像,特別是mm_struct結構的mmap欄位維護了整個程序的記憶體塊列表,該列表將在程序生存期間被大量地遍利或修改,因此mm_struct結構就有乙個欄位mmap_sem來對mmap的訪問進行保護,mmap_sem就是乙個讀寫訊號量,在proc檔案系統裡有很多程序記憶體使用情況的介面,通過它們能夠檢視某一程序的記憶體使用情況,命令free、ps和top都是通過proc來得到記憶體使用資訊的,proc介面就使用down_read和up_read來讀取程序的mmap資訊。當程序動態地分配或釋放記憶體時,需要修改mmap來反映分配或釋放後的記憶體映像,因此動態記憶體分配或釋放操作需要以寫者身份獲得讀寫訊號量mmap_sem來對mmap進行更新。系統呼叫brk和munmap就使用了down_write和up_write來保護對mmap的訪問。

Linux 互斥鎖 遞迴鎖 自旋鎖 讀寫鎖

在多執行緒中,我們經常會要用到鎖,那麼,鎖是什麼,我們為什麼要用到鎖?回到問題的本質,我們在什麼場景下會用到鎖?鎖是針對程式中的臨界資源,也就是公共資源的,當我們有兩個或多個執行緒同時對乙個臨界資源操作的時候,為了保證共享資料操作的完整性,我們要為這些公共資源加鎖。在linux中常見的鎖主要有互斥鎖...

linux執行緒同步之讀寫鎖

讀寫鎖與互斥量類似,不過讀寫鎖的並行性更高。讀寫鎖可以有三種狀態 1 讀模式加鎖 2 寫模式加鎖 3 不加鎖。在寫加鎖狀態時,在解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞。在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問許可權。但是如果執行緒希望以寫模式加鎖,它必須阻塞,直至...

Linux執行緒同步之讀寫鎖

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