1. 程式人生 > >todo:讀寫信號量

todo:讀寫信號量

結構 中斷 上下文 保持 方案 否則 down 聲明 配對

讀寫信號量的相關API有:

DECLARE_RWSEM(name)

該宏聲明一個讀寫信號量name並對其進行初始化。

void init_rwsem(struct rw_semaphore *sem);

該函數對讀寫信號量sem進行初始化。

void down_read(struct rw_semaphore *sem);

讀者調用該函數來得到讀寫信號量sem。該函數會導致調用者睡眠,因此只能在進程上下文使用。

int down_read_trylock(struct rw_semaphore *sem);

該函數類似於down_read,只是它不會導致調用者睡眠。它盡力得到讀寫信號量sem,如果能夠立即得到,它就得到該讀寫信號量,並且返回

1,否則表示不能立刻得到該信號量,返回0。因此,它也可以在中斷上下文使用。

void down_write(struct rw_semaphore *sem);

寫者使用該函數來得到讀寫信號量sem,它也會導致調用者睡眠,因此只能在進程上下文使用。

int down_write_trylock(struct rw_semaphore *sem);

該函數類似於down_write,只是它不會導致調用者睡眠。該函數盡力得到讀寫信號量,如果能夠立刻獲得,就獲得該讀寫信號量並且返回1,否則表示無法立刻獲得,返回0。它可以在中斷上下文使用。

void up_read(struct rw_semaphore *sem);

讀者使用該函數釋放讀寫信號量sem。它與down_readdown_read_trylock配對使用。如果down_read_trylock返回0,不需要調用up_read來釋放讀寫信號量,因為根本就沒有獲得信號量。

void up_write(struct rw_semaphore *sem);

寫者調用該函數釋放信號量sem。它與down_writedown_write_trylock配對使用。如果down_write_trylock返回0,不需要調用up_write,因為返回0表示沒有獲得該讀寫信號量。

void downgrade_write(struct rw_semaphore *sem);

該函數用於把寫者降級為讀者,這有時是必要的。因為寫者是排他性的,因此在寫者保持讀寫信號量期間,任何讀者或寫者都將無法訪問該讀寫信號量保護的共享資源,對於那些當前條件下不需要寫訪問的寫者,降級為讀者將,使得等待訪問的讀者能夠立刻訪問,從而增加了並發性,提高了效率。

讀寫信號量適於在讀多寫少的情況下使用,在linux內核中對進程的內存映像描述結構的訪問就使用了讀寫信號量進行保護。

究竟什麽時候使用自旋鎖什麽時候使用信號量,下面給出建議的方案

當對低開銷、短期、中斷上下文加鎖,優先考慮自旋鎖;當對長期、持有鎖需要休眠的任務,優先考慮信號量。

todo:讀寫信號量