sem t 等相關函式 訊號量

2021-06-25 16:41:55 字數 2825 閱讀 5334

訊號量的資料型別為結構sem_t

,它本質上是乙個長整型的數。

它的原型為: extern int sem_init __p ((sem_t *__sem, int __pshared, unsigned int __value));

標頭檔案為: #include 

sem為指向訊號量結構的乙個指標;

pshared不為

0時此訊號量在程序間共享,否則只能為當前程序的所有執行緒共享;

value給出了訊號量的初始值。

函式sem_post( sem_t *sem )

用來增加訊號量的值當有執行緒阻塞在這個訊號量上時,呼叫這個函式會使其中的乙個執行緒不再阻塞,選擇機制同樣是由執行緒的排程策略決定的。

函式sem_wait( sem_t *sem )

被用來阻塞當前執行緒直到訊號量

sem的值大於

0,解除阻塞後將

sem的值減一,表明公共資源經使用後減少。

函式sem_trywait ( sem_t *sem )

是函式sem_wait

()的非阻塞版本,它直接將訊號量

sem的值減一。

函式sem_destroy(sem_t *sem)

用來釋放訊號量

sem。

(1)訊號量用

sem_init

函式建立的,下面是它的說明:

#include

int sem_init (sem_t *sem, int pshared, unsigned int value);

這個函式的作用是對由sem

指定的訊號量進行初始化,設定好它的共享選項,並指定乙個整數型別的初始值。

pshared

引數控制著訊號量的型別。如果 

pshared

的值是0

,就表示它是當前里程的區域性訊號量;否則,其它程序就能夠共享這個訊號量。現在只對不讓程序共享的訊號量感興趣。(這個引數受版本影響), 

linux

執行緒目前不支援程序間共享訊號量,

pshared

傳遞乙個非零將會使函式返回

enosys

錯誤。(2

)這兩個函式控制著訊號量的值,它們的定義如下所示:

#include 

int sem_wait(sem_t * sem);

int sem_post(sem_t * sem);

這兩個函式都要用乙個由sem_init

呼叫初始化的訊號量物件的指標做引數。

sem_post函式的作用是給訊號量的值加上乙個

「1」,它是乙個

「原子操作

"即同時對同乙個訊號量做加

「1」操作的兩個執行緒是不會衝突的;而同時對同乙個檔案進行讀、加和寫操作的兩個程式就有可能會引起衝突。訊號量的值永遠會正確地加乙個

「2」--因為有兩個執行緒試圖改變它。

sem_wait函式也是乙個原子操作,它的作用是從訊號量的值減去乙個

「1」,但它永遠會先等待該訊號量為乙個非零值才開始做減法。也就是說,如果你對乙個值為

2的訊號量呼叫

sem_wait(),

執行緒將會繼續執行,訊號量的值將減到

1。如果對乙個值為

0的訊號量呼叫

sem_wait()

,這個函式就會地等待直到有其它執行緒增加了這個值使它不再是

0為止。如果有兩個執行緒都在

sem_wait()

中等待同乙個訊號量變成非零值,那麼當它被第三個執行緒增加乙個

「1」時,等待執行緒中只有乙個能夠對訊號量做減法並繼續執行,另乙個還將處於等待狀態。

訊號量這種「

只用乙個函式就能原子化地測試和設定

」的能力下正是它的價值所在。還有另外乙個訊號量函式

sem_trywait

,它是sem_wait

的非阻塞搭檔。

sem_trywait

是乙個立即返回函式,不會因為任何事情阻塞。根據其返回值得到不同的資訊。如果返回值為

0,說明訊號量在該函式呼叫之前大於

0,但是呼叫之後會被該函式自動減

1,至於呼叫之後是否為零則不得而知了。如果返回值為

eagain

說明訊號量計數為0。

(3) 獲得訊號量

sem的值,並儲存到

valp

中。下面的定義:

#include

int sem_getvalue(sem_t *sem, int *valp); (4

) 最後乙個訊號量函式是

sem_destroy

。這個函式的作用是在我們用完訊號量對它進行清理。下面的定義:

#include

int sem_destroy (sem_t *sem);

這個函式也使用乙個訊號量指標做引數,歸還自己佔據的一切資源。在清理訊號量的時候如果還有執行緒在等待它,使用者就會收到乙個錯誤。

然而在linux

的執行緒中,其實是沒有任何資源關聯到訊號量物件需要釋放的,因此在

linux

中,銷毀訊號量物件的作用僅僅是測試是否有執行緒因為該訊號量在等待。如果函式返回

0說明沒有,正常登出訊號量,如果返回

ebusy

,說明還有執行緒正在等待該訊號量的訊號。

與其它的函式一樣,這些函式在成功時都返回「0」

。1.宣告訊號量

sem_t sem1;

2.初始化訊號量

sem_init(&sem1,0,1);

3.sem_post和

sem_wait

函式配合使用來達到執行緒同步

4.釋放訊號量

int sem_destroy (sem_t *sem1);

C語言筆記 訊號量sem t

includeint sem init sem t sem,int pshared,unsigned int value sem init 初始化乙個定位在 sem 的匿名信號量。value 引數指定訊號量的初始值。pshared 引數指明訊號量是由程序內線程共享,還是由程序之間共享。如果 psha...

訊號量處理相關函式

訊號量處理函式 semget 使用格式 include int semget key t key int nsems,int sem 功能 建立乙個新的訊號量或獲取乙個已經存在的訊號量的鍵值。返回值 成功返回訊號量的標識碼id。失敗返回 1 引數 key 為整型值,使用者可以自己設定。有兩種情況 1...

System V 訊號量使用相關函式

在提到posix 訊號量時,指的是二值訊號量或計數訊號量,而system v訊號量指的是入了計數訊號量集 二值訊號量 其值為0或1,類似於互斥鎖,資源被鎖住時為0,資源可用為1 計數訊號量 其值在0和某個限制值之間的訊號量,訊號量的值就是可用資源數 計數訊號量集 乙個或多個訊號量構成乙個集合,集合中...