首先,訊號量分為核心訊號量和使用者程序訊號量。
一、核心訊號量
(1)初始化:
void sema_init (struct semaphore *sem, int val);
void init_mutex (struct semaphore *sem); //將sem的值置為1,表示資源空閒
void init_mutex_locked (struct semaphore *sem); //將sem的值置為0,表示資源忙
(2)申請核心訊號量所保護的資源:
void down(struct semaphore * sem); // 可引起睡眠
int down_interruptible(struct semaphore * sem); // down_interruptible能被訊號打斷
int down_trylock(struct semaphore * sem); // 非阻塞函式,不會睡眠。無法鎖定資源則
馬上返回
(3)釋放核心訊號量所保護的資源: void up(struct semaphore * sem);
二、使用者態訊號量
使用者態訊號量又分為system v訊號量與posix訊號量。其中,posix訊號量又分為有名訊號量與無名訊號量,有名訊號量存在檔案中,無名訊號量存在記憶體中,linux中只實現了無名訊號量。system v訊號量常用於程序同步,是乙個或多個訊號量的集合,所屬標頭檔案,使用複雜;posix訊號量常用於執行緒同步,所屬標頭檔案,使用簡單。
system v與posix訊號量函式清單如下:
systm v
posix
semctl()
sem_getvalue()
semget()
sem_post()
semop()
sem_timedwait()
sem_trywait()
sem_wait()
無名訊號量如下:
sem_init()
sem_destroy()
有名訊號量如下:
sem_close()
sem_open()
sem_unlink()
其中,posix 無名訊號量的2個函式原型如下:
int sem_init(sem_t *sem,int pshared,unsigned int value);
int sem_destroy(sem_t *sem);
此處sem_init有3個引數,與核心中的不同,pshared為訊號量最多由幾個程序共享。linux中只能取0。value一般為1,表示資源可用,為0表示不可用。
訊號量的原理總結
談到訊號量,大多數會立馬想到pv操作,這個用荷蘭語表示的專有名詞。對比前面我們說的,四種實現臨界區互斥的軟體設計演算法,pv操作更加的優良,現在這裡就將對其原理進行詳細的解釋分析,以及如何在題目的場景中使用,包括演算法的設計和問題的分析。首先,訊號量機制我們著重談兩個設計思路,核心相同,設計有細微的...
訊號量學習總結(一)
訊號量學習總結 一 訊號量是一種用於如果不同程序間或乙個給定程序的不同執行緒間同步的原語。建立乙個新的有名訊號量或開啟乙個已存在的有名訊號量。sem t sem open const char name,int oflag sem t sem open const char name,int ofl...
訊號量Semaphore學習總結
訊號量 semaphore 有時被稱為訊號燈,是在多執行緒環境下使用的一種設施,是可以用來保證兩個或多個關鍵 段不被併發呼叫。在進入乙個關鍵 段之前,執行緒必須獲取乙個訊號量 一旦該關鍵 段完成了,那麼該執行緒必須釋放訊號量。其它想進入該關鍵 段的執行緒必須等待直到第乙個執行緒釋放訊號量。為了完成這...