程序間同步之訊號量

2021-08-17 18:06:31 字數 2605 閱讀 4518

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

二值訊號量:訊號量的值只有0和

1,若資源被鎖住,訊號量的值為

0,若資源可用,則訊號量的值為1;

計數訊號量 :訊號量的值在

0到乙個大於

1的限制值

。該計數表示可用的資源的個數。

該操作會檢查訊號量的值,如果其值小於或等於

0,那就阻塞,直到該值變成大於

0,然後等待程序將訊號量的值減

1,程序獲得共享資源的訪問許可權。

該操作將訊號量的值加

1,如果有程序阻塞著等待該訊號量,那麼其中乙個程序將被喚醒。

product=0;//已生產的產品數量

consumer=1;//可生成的產品數目

//生產者程序

while(1)

//消費者程序

while(1)

int semget(key_t key, int num_sems, int sem_flags);
key:訊號量鍵   num_sems指定需要的訊號量數目   semget函式成功返回乙個相應訊號識別符號(非零),失敗返回-1。

int semop(int sem_id, struct sembuf *sops, size_t nsops);
sembuf 結構體對應乙個特定訊號的操作。

struct sembuf;

//sem_op > 0 訊號加上 sem_op 的值,表示程序釋放控制的資源;

//sem_op = 0 如果sem_***沒有設定ipc_nowait,則呼叫程序進入睡眠狀態,直到訊號量的值為0;否則程序不會睡眠,直接返回 eagain

//sem_op < 0 訊號加上 sem_op 的值。若沒有設定 ipc_nowait ,則呼叫程序阻

//塞,直到資源可用;否則程序直接返回eagain

int semctl(int sem_id, int sem_num, int command, ...);
函式的第乙個引數 semid 為訊號量集的識別符號;

函式的第二個引數sem_num

則是表示即將要進行操作的訊號量的編號,即訊號量集合的索引值,其中第乙個訊號量的索引值為0。

函式的第3個引數command代表將要在集合上執行的命令,其取值含義如下,通常用特定的巨集代替:

ipc_stat:獲取某個訊號量集合的semid_ds結構,並將其儲存在semun聯合體的buf引數所指的位址之中

ipc_set:設定某個集合的semid_ds結構的ipc_perm成員的值,該命令所取的值是從semun聯合體的buf引數中取到的

ipc_rmid:從核心刪除該訊號量集合

getall:用於獲取集合中所有訊號量的值,整數值存放在無符號短整數的乙個陣列中,該陣列有聯合體的array成員所指定

getncnt:返回當前正在等待資源的程序的數目

getpid:返回最後一次執行pv操作(semop函式呼叫)的程序的pid

getval:返回集合中某個訊號量的值

getzcnt:返回正在等待資源利用率達到百分之百的程序的數目

setall:把集合中所有訊號量的值,設定為聯合體的array成員所包含的對應值

setval:將集合中單個訊號量的值設定為聯合體的val成員的值。

int sem_id = 0;

union semun;

//用於初始化訊號量,在使用訊號量前必須這樣做 

int set_semvalue()

void del_semvalue()

int semaphore_p()

return 1;

} int semaphore_v()

return 1;

}

#include#include#include#include#include#include#include#include#include#define maxsem 1

//申明三個訊號量

int fullid;

int emptyid;

int mutxid;

int main()

sleep(10);

printf("producter over\n");

exit(0);

}else

printf("comsumera is over");

exit(0);

}else

printf("comsumerb is over");

exit(0);}}

}return 0;

}

執行結果:

程序間同步之訊號量(semaphore)

程序間同步之訊號量 semaphore 1.訊號量的建立與使用 linux下使用semget建立或開啟訊號量集,int semget key t key,int nsems,int sem 該函式執行成功則返回乙個訊號量集的識別符號,失敗返回 1。返回的引數key是由ftok得到的鍵值 第二個引數n...

程序間同步 訊號量集

一 建立或者開啟訊號量 int semget key t key,int nsems,訊號量集中訊號量的個數 int flag 開啟 0,建立 ipc creat 0644 返回值 返回訊號量集的識別符號 檢視訊號量 ipcs s 具體案例 include include include inclu...

linux程序間同步之POSIX訊號量

閱讀linux系統程式設計手冊筆記 posix訊號量跟system v訊號量一樣,都是用於程序和執行緒同步對同享資源的訪問。訊號量 posix,system v 是乙個整數,其值是不能小於0的。posix訊號量主要分為 命名訊號量 未命名訊號量。首先先介紹命名訊號量。先來看看命名訊號量的主要api ...