概念:訊號量是乙個特殊的變數,程式對其訪問都是原子操作,且只允許對它進行等待(即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 ...