原來總是用互斥鎖(mutex)和環境變數(cond)去控制線程的通訊,用起來挺麻煩的,用訊號量(sem)來通訊控制就方便多了!
用到訊號量就要包含semaphore.h標頭檔案。
可以用sem_t型別來宣告乙個型號量。
用int sem_init(sem_t *sem, int pshared, unsigned int value)函式來初始化型號量,第乙個引數就是用sem_t宣告的訊號量,第二變數如果為0,表示這個訊號量只是當前程序中的型號量,如果不為0,這個訊號量可能可以在兩個程序中共享。第三個引數就是初始化訊號量的多少值。
sem_wait(sem_t *sem)函式用於接受訊號,當sem>0時就能接受到訊號,然後將sem--;
sem_post(sem_t *sem)函式可以增加訊號量。
sem_destroy(sem_t *sem)函式用於解除訊號量。
以下是乙個用訊號控制的乙個簡單的例子。
1.#include
2.#include
3.#include
4.sem_t sem1, sem2;
5.
6.void *thread1(void *arg)
7.
13.
14.void *thread2(void *arg)
15.
19.
20.int main()
21.
程式的實現是控制先讓thread1執行緒列印"hello "再讓thread2執行緒列印"world!".
linux執行緒間通訊 訊號量
鎖機制使用是有限制的,鎖只有兩種狀態,即加鎖和解鎖,對於互斥的訪問乙個全域性變數,這樣的方式還可以對付,但是要是對於其他的臨界資源,比如說多台印表機等,這種方式顯然不行了。訊號量機制在作業系統裡面學習的比較熟悉了,訊號量是乙個整數計數器,其數值表示空閒臨界資源的數量。當有程序釋放資源時,訊號量增加,...
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...