讀寫訊號量在核心中是由rw_semaphore結構表示的:
在中/*
* the semaphore definition
*/struct rw_semaphore ;
靜態建立讀寫訊號量:
#define __rwsem_initializer(name) /
#define declare_rwsem(name) /
struct rw_semaphore name = __rwsem_initializer(name)
動態建立讀寫訊號量:
extern
void __init_rwsem(struct rw_semaphore *sem, const
char *name,
struct lock_class_key *key);
#define init_rwsem(sem) /
do while (0)
/** initialize an rwsem:
*/void __init_rwsem(struct rw_semaphore *sem, const
char *name,
struct lock_class_key *key)
所有讀寫訊號量都是互斥訊號量。只要沒有寫者,併發持有讀鎖的讀者數不限。沒有讀者時,只有唯一的寫者可以獲得寫鎖。所有讀寫鎖的睡眠都不會被訊號打斷,所以它只有乙個版本的down()操作。
/** lock for reading
*/static
inline
void __down_read(struct rw_semaphore *sem) /*
* lock for writing
*/static
inline
void __down_write_nested(struct rw_semaphore *sem, int subclass)
static
inline
void __down_write(struct rw_semaphore *sem) /*
* unlock after reading
*/static
inline
void __up_read(struct rw_semaphore *sem)
/** unlock after writing
*/static
inline
void __up_write(struct rw_semaphore *sem)
與標準訊號量一樣,讀寫訊號量也提供了down_read_trylock()和down_write_trylock()方法。
/** trylock for reading -- returns 1 if successful, 0 if contention
*/static
inline
int __down_read_trylock(struct rw_semaphore *sem)
/** trylock for writing -- returns 1 if successful, 0 if contention
*/static
inline
int __down_write_trylock(struct rw_semaphore *sem)
讀寫訊號量相比讀寫自旋鎖多一種特有的操作:downgrade_writer(),這個函式可以動態地將獲取的寫鎖轉換為讀鎖。
/** downgrade write lock to read lock
*/static
inline
void __downgrade_write(struct rw_semaphore *sem) 呵呵
Linux同步 讀寫訊號量
以下內容 訊號量 一,訊號量和自旋鎖的區別 訊號量與自旋鎖有一定的區別,訊號量在無法得到資源時,核心執行緒處於睡眠阻塞狀態,而自旋鎖處於忙等待狀態。因此,如果資源被占用時間很短時,使用自旋鎖較好,因為它可節約排程時間。如果資源被占用的時間較長,使用訊號量較好。二,訊號量相關的api 訊號量的相關ap...
讀寫訊號量(todo)
讀寫訊號量的相關api有 declare rwsem name 該巨集宣告乙個讀寫訊號量name並對其進行初始化。void init rwsem struct rw semaphore sem 該函式對讀寫訊號量sem進行初始化。void down read struct rw semaphore ...
執行緒同步之訊號量同步
linux中兩種基本的同步方法是訊號量和互斥量。這兩種方法很相似,而且它們可以相互通過對方來實現。現在有個圖書館,其能容納100人,現在有兩個執行緒a b,a執行緒執行 往圖書管理進入乙個人,b執行緒 從圖書館出來乙個人。那麼為了使得執行緒a在圖書館滿人的時候進入等待,而不是繼續往圖書館裡進人,使得...