核心同步方法之讀寫訊號量

2021-04-23 10:54:21 字數 1873 閱讀 7108

讀寫訊號量在核心中是由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在圖書館滿人的時候進入等待,而不是繼續往圖書館裡進人,使得...