Linux系統程式設計之訊號量

2021-10-25 02:08:03 字數 2155 閱讀 8776

一、什麼是訊號量

為了防止出現因多個程式同時訪問乙個共享資源而引發的一系列問題,我們需要一種方法,它可以通過生成並使用令牌來授權,在任一時刻只能有乙個執行執行緒訪問**的臨界區域。臨界區域是指執行資料更新的**需要獨佔式地執行。而訊號量就可以提供這樣的一種訪問機制,讓乙個臨界區同一時間只有乙個執行緒在訪問它,也就是說訊號量是用來調協程序對共享資源的訪問的。

訊號量是乙個特殊的變數,程式對其訪問都是原子操作,且只允許對它進行等待(即p(訊號變數))和傳送(即v(訊號變數))資訊操作。最簡單的訊號量是只能取0和1的變數,這也是訊號量最常見的一種形式,叫做二進位制訊號量。而可以取多個正整數的訊號量被稱為通用訊號量。這裡主要討論二進位制訊號量。

二、訊號量的工作原理

由於訊號量只能進行兩種操作等待和傳送訊號,即p(sv)和v(sv),他們的行為是這樣的:

p(sv):如果sv的值大於零,就給它減1;如果它的值為零,就掛起該程序的執行

v(sv):如果有其他程序因等待sv而被掛起,就讓它恢復執行,如果沒有程序因等待sv而掛起,就給它加1.

舉個例子,就是兩個程序共享訊號量sv,一旦其中乙個程序執行了p(sv)操作,它將得到訊號量,並可以進入臨界區,使sv減1。而第二個程序將被阻止進入臨界區,因為當它試圖執行p(sv)時,sv為0,它會被掛起以等待第乙個程序離開臨界區域並執行v(sv)釋放訊號量,這時第二個程序就可以恢復執行。

三、linux的訊號量機制

linux提供了一組精心設計的訊號量介面來對訊號進行操作,它們不只是針對二進位制訊號量,下面將會對這些函式進行介紹,但請注意,這些函式都是用來對成組的訊號量值進行操作的。它們宣告在標頭檔案sys/sem.h中。

1、semget函式

它的作用是建立乙個新訊號量或取得乙個已有訊號量,原型為:

int semget(key_t key, int num_sems, int sem_flags);

key:鍵值

num_sems:指定需要的訊號量數目,它的值幾乎總是1

sem_flags:是一組標誌,當想要當訊號量不存在時建立乙個新的訊號量,可以和值ipc_creat做按位或操作。設定了ipc_creat標誌後,即使給出的鍵是乙個已有訊號量的鍵,也不會產生錯誤。而ipc_creat | ipc_excl則可以建立乙個新的,唯一的訊號量,如果訊號量已存在,返回乙個錯誤。

semget函式成功返回乙個相應訊號識別符號(非零),失敗返回-1.

2、semop函式

它的作用是改變訊號量的值,原型為:

int semop(int sem_id, struct sembuf *sem_opa, size_t num_sem_ops);

sem_id:semget返回的訊號量識別符號

sembuf結構的定義如下:

struct sembuf;

3、semctl函式

該函式用來直接控制訊號量資訊,它的原型為:

int semctl(int sem_id, int sem_num, int command, …);

如果有第四個引數,它通常是乙個union semum結構,定義如下:

union semun;

前兩個引數與前面乙個函式中的一樣,command通常是下面兩個值中的其中乙個

setval:用來把訊號量初始化為乙個已知的值。p 這個值通過union semun中的val成員設定,其作用是在訊號量第一次使用前對它進行設定。

ipc_rmid:用於刪除乙個已經無需繼續使用的訊號量識別符號。

訊號量演示

#include

#include

#include

#include

#include

#include

#include

union semun

;void

pgetkey

(int id)

void

vputbackkey

(int id)

intmain()

else

if(pid ==0)

else

return0;

}~

Linux系統程式設計(有名訊號量)

在 posix 標準中,訊號量分兩種,一種是無名訊號量,一種是有名訊號量。無名訊號量一般用於執行緒間同步或互斥,而有名訊號量一般用於程序間同步或互斥。它們的區別和管道及命名管道的區別類似,無名訊號量則直接儲存在記憶體中,而有名訊號量要求建立乙個檔案。1 建立乙個有名訊號量 所需標頭檔案 includ...

Linux系統程式設計21 執行緒同步 訊號量

訊號量 可以應用於執行緒 程序間同步。相當於初始化為 n 的互斥量。注意 訊號和訊號量沒什麼關係 n值,表示可以同時訪問共享資料區的執行緒數。函式 sem t sem 定義型別。int sem init sem t sem,int pshared,unsigned int value 引數 sem ...

訊號量程式設計

訊號量sem wait 的使用 閒來無事,我給大家講下unix linux下訊號量函式的使用。首先你得知道什麼叫訊號量,什麼時候要用訊號量。這個嘛,主要就是用來保護共享資源的,也就是說如果你想限制某個 些 資源在同一時刻只能有一 多 個執行緒擁有,就可以使用訊號量。當然也可以用作讓乙個執行緒等待另乙...