鎖機制使用是有限制的,鎖只有兩種狀態,即加鎖和解鎖,對於互斥的訪問乙個全域性變數,這樣的方式還可以對付,但是要是對於其他的臨界資源,比如說多台印表機等,這種方式顯然不行了。
訊號量機制在作業系統裡面學習的比較熟悉了,訊號量是乙個整數計數器,其數值表示空閒臨界資源的數量。
當有程序釋放資源時,訊號量增加,表示可用資源數增加;當有程序申請到資源時,訊號量減少,表示可用資源數減少。這個時候可以把鎖機制認為是0-1訊號量。
訊號量機制的api
1、初始化訊號量
int sem_init(sem_t * sem, int pshared, unsigned int value)
//引數1:訊號量名稱
//引數2:0表示在當前程序的所有執行緒共享。其他值表示在程序間共享
//引數3:訊號量初始值
2、等待訊號量
訊號量減一操作,類似於p操作。
int sem_wait(sem_t *sem)
//引數1:訊號量
3、釋放訊號量
訊號量加一操作,類似於v操作
int sem_post(sem_t *sem)
//引數1:訊號量
4、銷毀訊號量
生產者把資源放入儲存區,消費者進行獲取。
參考:
Linux執行緒間用訊號量通訊
原來總是用互斥鎖 mutex 和環境變數 cond 去控制線程的通訊,用起來挺麻煩的,用訊號量 sem 來通訊控制就方便多了!用到訊號量就要包含semaphore.h標頭檔案。可以用sem t型別來宣告乙個型號量。用int sem init sem t sem,int pshared,unsigne...
linux 訊號量(程序間通訊)
將使用乙個程式來演示訊號量的使用,程式用pv操作控制訊號量,以操作臨界區,p操作讓訊號量減1,v操作讓訊號量加1,而pv操作之間的 即為臨界區關鍵 每次只能由乙個程序訪問。程式建立出乙個子程序,在兩個程序中分別有一段臨界區關鍵 實現的功能都是不斷的順序輸出0 9的字元。保證程序間同步 plain v...
linux 程序間通訊 訊號量
例項中首先使用fork 建立乙個子程序,在父程序呼叫kill 之前,在子程序中使用raise 向自身傳送sigstop訊號,是子程序暫停。接下來使用kill 向子程序傳送訊號 ngnsvr9 none home xionghailong example cat kill raise.c includ...